src/share/classes/java/lang/System.java

Print this page
rev 9786 : 8022854: System.setProperties(null) causes implementation private properties to reappear
Reviewed-by: alanb, mchung

@@ -655,12 +655,11 @@
      * <code>checkPropertiesAccess</code> method is called with no
      * arguments. This may result in a security exception.
      * <p>
      * The argument becomes the current set of system properties for use
      * by the {@link #getProperty(String)} method. If the argument is
-     * <code>null</code>, then the current set of system properties is
-     * forgotten.
+     * <code>null</code>, then the default system properties are reloaded.
      *
      * @param      props   the new system properties.
      * @exception  SecurityException  if a security manager exists and its
      *             <code>checkPropertiesAccess</code> method doesn't allow access
      *              to the system properties.

@@ -672,15 +671,14 @@
     public static void setProperties(Properties props) {
         SecurityManager sm = getSecurityManager();
         if (sm != null) {
             sm.checkPropertiesAccess();
         }
-        if (props == null) {
-            props = new Properties();
-            initProperties(props);
-        }
-        System.props = props;
+
+        System.props = (props != null)
+            ? props
+            : sun.misc.VM.getSanitizedSavedProperties();
     }
 
     /**
      * Gets the system property indicated by the specified key.
      * <p>

@@ -1160,29 +1158,31 @@
         // very beginning of the initialization and all system properties to
         // be put into it directly.
         props = new Properties();
         initProperties(props);  // initialized by the VM
 
+        // requires System.setProperty()
+        sun.misc.Version.init();
+
         // There are certain system configurations that may be controlled by
         // VM options such as the maximum amount of direct memory and
         // Integer cache size used to support the object identity semantics
         // of autoboxing.  Typically, the library will obtain these values
-        // from the properties set by the VM.  If the properties are for
-        // internal implementation use only, these properties should be
-        // removed from the system properties.
+        // from the properties set by the VM.
         //
         // See java.lang.Integer.IntegerCache and the
-        // sun.misc.VM.saveAndRemoveProperties method for example.
+        // sun.misc.VM.getSanitizedSavedProperties method for example.
         //
         // Save a private copy of the system properties object that
-        // can only be accessed by the internal implementation.  Remove
-        // certain system properties that are not intended for public access.
-        sun.misc.VM.saveAndRemoveProperties(props);
+        // can only be accessed by the internal implementation.
+        sun.misc.VM.saveVMSystemProperties(props);
 
+        // Initialize the public system properties without certain properties
+        // that are intended for internal implementation use only.
+        props = sun.misc.VM.getSanitizedSavedProperties();
 
         lineSeparator = props.getProperty("line.separator");
-        sun.misc.Version.init();
 
         FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
         FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
         FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
         setIn0(new BufferedInputStream(fdIn));