On Tue, 8 Dec 2020 11:41:33 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:
> This change have been already reviewed by Mandy, Alan and David. > Now, the PR approval is needed. > The push was postponed because the CSR was not approved at that time (it is > now): > https://bugs.openjdk.java.net/browse/JDK-8248189 > Investigation of existing popular java agents was requested by Joe. > ---------- > > The java.lang.instrument spec: > > https://docs.oracle.com/en/java/javase/15/docs/api/java.instrument/java/lang/instrument/package-summary.html > > Summary: > The java.lang.instrument spec clearly states: > "The agent class must implement a public static premain method > similar in principle to the main application entry point." > Current implementation of sun/instrument/InstrumentationImpl.java > allows the premain method be non-public which violates the spec. > This fix aligns the implementation with the spec. > > Testing: > A mach5 run of jdk_instrument tests is in progress. src/java.instrument/share/classes/sun/instrument/InstrumentationImpl.java line 501: > 499: String msg = "method " + classname + "." + methodname + " > must be declared public"; > 500: throw new IllegalAccessException(msg); > 501: } If canAccess fails then it means that javaAgentClass is not public or the premain method is not public. The invoke will fail but I agree eat explicit canAccess check means we get finer control on the exception message. (I can't help feeling that we should do a bit more cleanup here and not use getDeclaredMethod or be concerned with inheritance. This is because the Premain-Class is meant to specify the agent class. Also can't have a public static premain in super class and a non-public static premain in a sub-class). ------------- PR: https://git.openjdk.java.net/jdk/pull/1694