Review request: JDK-8159596 Add java --dry-run
Peter Levart
peter.levart at gmail.com
Thu Jun 30 07:37:53 UTC 2016
Hi Mandy,
The following patch:
--- old/src/java.base/share/native/libjli/java.c 2016-06-30
09:32:59.519839770 +0200
+++ new/src/java.base/share/native/libjli/java.c 2016-06-30
09:32:59.458839421 +0200
@@ -476,15 +476,6 @@
*/
PostJVMInit(env, appClass, vm);
CHECK_EXCEPTION_LEAVE(1);
- /*
- * The LoadMainClass not only loads the main class, it will also ensure
- * that the main method's signature is correct, therefore further
checking
- * is not required. The main method is invoked here so that
extraneous java
- * stacks are not in the application stack trace.
- */
- mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
- "([Ljava/lang/String;)V");
- CHECK_EXCEPTION_NULL_LEAVE(mainID);
/* Build platform specific argument array */
mainArgs = CreateApplicationArgs(env, argv, argc);
@@ -493,6 +484,16 @@
if (dryRun) {
ret = 0;
} else {
+ /*
+ * The LoadMainClass not only loads the main class, it will
also ensure
+ * that the main method's signature is correct, therefore
further checking
+ * is not required. The main method is invoked here so that
extraneous java
+ * stacks are not in the application stack trace.
+ */
+ mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
+ "([Ljava/lang/String;)V");
+ CHECK_EXCEPTION_NULL_LEAVE(mainID);
+
/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
...that just moves the call to GetStaticMethodID to inside the else
branch of if (dryRun) statement fixes the problem. The presence and
conformance of main method is already verified by LaucherHelper in a way
that doesn't initialize the main class. It's just GetStaticMethodID that
causes its initialization.
Regards, Peter
On 06/30/2016 08:43 AM, Peter Levart wrote:
> On 06/30/2016 08:32 AM, Peter Levart wrote:
>> But is it possible to check for the presence of a method in a class
>> without initializing it? Maybe the check for the presence of main
>> method could simply be dropped out of --dry-run?
>
> It seems that it *is* possible to check for the presence of a method
> without initializing the class. The following:
>
> public class Test {
>
> static class Nested {
> static {
> System.out.println("Hello from Nested.<clinit>");
> }
>
> static void m() {}
> }
>
> public static void main(String[] args) throws Exception {
> System.out.println(Nested.class.getDeclaredMethod("m"));
> }
> }
>
>
> ...prints just:
>
> static void Test$Nested.m()
>
>
>
> Regards, Peter
>
More information about the jigsaw-dev
mailing list