-
Enhancement
-
Resolution: Duplicate
-
P4
-
None
-
5.0
-
x86
-
windows_xp
A DESCRIPTION OF THE REQUEST :
Since Java 5, class literal constructs do not trigger class initialization anymore. Therefore, code depending on this side-effect is broken and needs to explicitly load and initialize classes by its name and classLoader. This is a well-known problem, documented at http://java.sun.com/javase/technologies/compatibility.jsp#literal .
This RFE proposes adding two new methods to java.lang.Class: initialize() and isInitialized() .
JUSTIFICATION :
java.lang.Class.initialize() is needed since existing code depend on classes been initialized. There is no way to force initialization of a Class instance besides loading it using the following idiom:
Class.forName(clazz.getName(), true, clazz.getClassLoader());
which is ugly, requires users to catch an exception that should never been thrown in this situation (ClassNotFoundException) and requires RuntimePermission("getClassLoader") if clazz.getClassLoader() == null.
java.lang.Class.isInitialized() is needed for consistency and in order to be able to emit warnings for the cases where initialization can affect the result of an operation or a method.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
These two methods could be implemented as follows:
/**
* Initializes the class or interface represented by this instance.
*<p>Initialization of a class consists of executing its static initializers and the initializers
* for static fields (class variables) declared in the class. Initialization of an interface
* consists of executing the initializers for fields (constants) declared there.</p>
* <p>Before a class is initialized, its superclass must be initialized, but interfaces
* implemented by the class are not initialized. Similarly, the superinterfaces of an interface
* are not initialized before the interface is initialized.</p>
* <p>For more details, please refer to the <a
* href="http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44557">JLS
* section 12.4</a>
* @exception LinkageError if the linkage fails
* @exception ExceptionInInitializerError if the initialization provoked
* by this method fails
* @see #isInitialized()
*/
public void initialize();
/**
* Determines if the class or interface represented by this instance has been initialized.
*<p>Initialization of a class consists of executing its static initializers and the initializers
* for static fields (class variables) declared in the class. Initialization of an interface
* consists of executing the initializers for fields (constants) declared there.</p>
* <p>For more details, please refer to the <a
* href="http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44557">JLS
* section 12.4</a>
* @return <code>true</code> if this class has already been initialized;
* <code>false</code> otherwise.
* @see #initialize()
*/
public boolean isInitialized();
CUSTOMER SUBMITTED WORKAROUND :
For initialize(), the above inefficient idiom works. There is no replacement for isInitialized() except for relying on side-effects of a specific Class object been initialized, i.e., it is not always possible to work around it.
Since Java 5, class literal constructs do not trigger class initialization anymore. Therefore, code depending on this side-effect is broken and needs to explicitly load and initialize classes by its name and classLoader. This is a well-known problem, documented at http://java.sun.com/javase/technologies/compatibility.jsp#literal .
This RFE proposes adding two new methods to java.lang.Class: initialize() and isInitialized() .
JUSTIFICATION :
java.lang.Class.initialize() is needed since existing code depend on classes been initialized. There is no way to force initialization of a Class instance besides loading it using the following idiom:
Class.forName(clazz.getName(), true, clazz.getClassLoader());
which is ugly, requires users to catch an exception that should never been thrown in this situation (ClassNotFoundException) and requires RuntimePermission("getClassLoader") if clazz.getClassLoader() == null.
java.lang.Class.isInitialized() is needed for consistency and in order to be able to emit warnings for the cases where initialization can affect the result of an operation or a method.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
These two methods could be implemented as follows:
/**
* Initializes the class or interface represented by this instance.
*<p>Initialization of a class consists of executing its static initializers and the initializers
* for static fields (class variables) declared in the class. Initialization of an interface
* consists of executing the initializers for fields (constants) declared there.</p>
* <p>Before a class is initialized, its superclass must be initialized, but interfaces
* implemented by the class are not initialized. Similarly, the superinterfaces of an interface
* are not initialized before the interface is initialized.</p>
* <p>For more details, please refer to the <a
* href="http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44557">JLS
* section 12.4</a>
* @exception LinkageError if the linkage fails
* @exception ExceptionInInitializerError if the initialization provoked
* by this method fails
* @see #isInitialized()
*/
public void initialize();
/**
* Determines if the class or interface represented by this instance has been initialized.
*<p>Initialization of a class consists of executing its static initializers and the initializers
* for static fields (class variables) declared in the class. Initialization of an interface
* consists of executing the initializers for fields (constants) declared there.</p>
* <p>For more details, please refer to the <a
* href="http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44557">JLS
* section 12.4</a>
* @return <code>true</code> if this class has already been initialized;
* <code>false</code> otherwise.
* @see #initialize()
*/
public boolean isInitialized();
CUSTOMER SUBMITTED WORKAROUND :
For initialize(), the above inefficient idiom works. There is no replacement for isInitialized() except for relying on side-effects of a specific Class object been initialized, i.e., it is not always possible to work around it.
- duplicates
-
JDK-4993813 (reflect) Need a way to force a class to be initialized.
- Closed