JVMS 5.5 is the spec for class initialization.  Step 3 describes the recursive request for initialization.

I have @jvms 5.5 in the javadoc. I can make it explicit:

         * Ensures that {@code targetClass} has been initialized. The class
         * to be initialized must be {@linkplain #accessClass accessible}
         * to this {@code Lookup} object.  This method causes {@code targetClass}
         * to be initialized if it has not been already initialized,
         * as specified in JVMS {@jvms 5.5}.

There are detailed rules about class initialization in JVMS 5.5.

Mandy

On 6/4/20 12:13 PM, Paul Sandoz wrote:
Hi Mandy,

What about this case:

class Test {
   static {
     MethodHandles.lookup().ensureClassInitialized(Test.class);
     // not yet initialized
   }
}

(I see you do that for m/p1/A.java and Test.clinitInvokeEnsureClassInitialized.)

Do we need mention this in the spec? e.g. this method does nothing if the class 
is already initialized or if the class is in the process of being initialized?

Paul.

On Jun 3, 2020, at 4:16 PM, Mandy Chung <mandy.ch...@oracle.com> wrote:

This proposes a new `Lookup::ensureClassInitialized` API as a replacement
for `sun.misc.Unsafe::ensureClassInitialized`.The Lookup object must have
the access to the given class being initialized.

CSR: https://bugs.openjdk.java.net/browse/JDK-8245871

webrev:
http://cr.openjdk.java.net/~mchung/jdk15/webrevs/8235521/webrev.01/

This patch converts the JDK use of 
`jdk.internal.misc.Unsafe::ensureClassInitialized` to
call this new API where appropriate. `Unsafe::ensureClassInitialized` remains 
for java.lang.invoke.* internal implementation use.

A framework can use `Lookup::privateLookupIn` to access a class in another 
module if the module authorizes it by opening the packages for it to access. Or 
a user can produce a less privileged lookup by Lookup::dropLookupMode and pass 
it to the framework.

`Class::ensureInitialized` was considered as an alternative. The downside for 
this option is that it would be caller sensitive in order to ensure the caller 
has the proper access to this class.  And it may not work for frameworks which 
have no access to user classes. It would have to fallback toClass::forName` 
limited solution.

Thanks
Mandy


Reply via email to