Review request: JDK-8159596 Add java --dry-run

David Holmes david.holmes at oracle.com
Fri Jul 1 04:44:24 UTC 2016



On 30/06/2016 5:37 PM, Peter Levart wrote:
> 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.

I had assumed that initialization was desirable as part of checking that 
everything was specified correctly. If not then --dry-run would seem to 
do very little compared to just running -version, and so doesn't really 
seem to carry its weight.

Cheers,
David

>
>
> 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