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