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