----- Original Message ----- > From: "Cheng Jin" <jinch...@ca.ibm.com> > To: "core-libs-dev" <core-libs-dev@openjdk.java.net> > Sent: Thursday, March 17, 2022 5:42:57 PM > Subject: When to initialize the method's class for > MethodHandles.Lookup.findStatic()?
> Hi there, > > The document of > https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#findStatic(java.lang.Class,java.lang.String,java.lang.invoke.MethodType) > in the Java API is ambiguous in terms of when to initialize the method's class > as follows (the same description as in other OpenJDK versions) > > If the returned method handle is invoked, the method's class will be > initialized, if it has not already been initialized. > > > It occurs to me that the method's class should be initialized when invoking > the > method handle but OpenJDK actually chooses to do the initialization in > lookup.findStatic() rather than in mh.invoke() > e.g. > import java.lang.invoke.*; > > public class Test_1 { > static MethodHandle mh = MethodHandles.lookup().findStatic(Test_2.class, > "testMethod", MethodType.methodType(int.class, int.class)); <----------- > Test_2.class gets initialized and verified. > > public static void main(String[] args) throws Throwable { > Test_1.mh.invoke(); > } > } > > public class Test_2 { > static int testMethod(int value) { return (value + 1); } > } > > So there should be more clear explanation what is the correct or expected > behaviour at this point and why OpenJDK doesn't comply with the document to > delay the initialization of the method's class to mh.invoke(). Hi, if by initialization you mean running the static block, then it's a bug. As far as i remember, the JVMS spec cleanly separate the Linking exceptions from the Runtime exceptions. https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-6.html#jvms-6.5.invokestatic The linking exceptions occurs when calling findStatic() while the runtime exceptions will appear at runtime when calling invokeExact()/invoke(). > > Best Regards > Cheng Jin regards, Rémi