15 RFR(XS): 8165276: Spec states that invoke the premain method in an agent class if it's public but implementation differs

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Wed Jun 24 06:55:36 UTC 2020


On 6/23/20 23:33, Alan Bateman wrote:
>
>
> On 24/06/2020 07:24, serguei.spitsyn at oracle.com wrote:
>> :
>>
>> One approach would be to continue using the setAccessible and add 
>> extra check for non-public premain method.
>> Something like should probably work:
>>         if (!(Modifier.isPublic(m.getModifiers())) {
>>             throw new IllegalAccessException("premain method is not 
>> public");
>>         }
> The equivalent with the java launcher is:
>
> $ java Foo.java
> error: 'main' method is not declared 'public static'
>
> $ javac Foo.java
> $ java Foo
> Error: Main method not found in class Foo, please define the main 
> method as:
>    public static void main(String[] args)
>
> So have the exception message provide a helpful message will be useful 
> in the event that someone tries to deploy that doesn't have a public 
> premain method.

Thank you for the example.
Yes, I'm working on a helpful message and was thinking to use the 
Reflection method:
  IllegalAccessException newIllegalAccessException(Class<?> currentClass,
                                                   Class<?> memberClass,
                                                   Class<?> targetClass,
                                                   int modifiers);

>
> BTW: Have you checked the agentmain case too?

The InstrumentationImpl::loadClassAndStartAgent() is common for both 
premain and agentmain.
I'll update the CSR and my new test to cover the agentmain as well.

Thanks,
Serguei

>
> -Alan.
>
>
>
>
>



More information about the serviceability-dev mailing list