RFR: 8285401: Proxy class initializer should use 3-arg `Class.forName` to avoid unnecessary class initialization [v3]

Jaikiran Pai jpai at openjdk.java.net
Tue May 24 05:41:49 UTC 2022


On Fri, 20 May 2022 18:22:47 GMT, liach <duke at openjdk.java.net> wrote:

>> Simplify calls `Class.forName(String, boolean, ClassLoader)` instead of `Class.forName(String)`. `make test TEST="jtreg:test/jdk/java/lang/reflect/Proxy"` passes, with the new `LazyInitializationTest` failing the eager initialization check on the baseline and passing with this patch.
>> 
>> On a side note, this might reduce the number of methods that can be encoded in a proxy due to code attribute size restrictions; we probably would address that in another issue, as we never mandated a count of methods that the proxy must be able to implement.
>> 
>> Mandy, would you mind review this?
>
> liach has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Move the try catch block as it doesn't throw checked exceptions

src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 605:

> 603:         mv.visitLdcInsn(Type.getObjectType(dotToSlash(className)));
> 604:         mv.visitMethodInsn(INVOKEVIRTUAL, JL_CLASS,
> 605:                 "getClassLoader", "()" + LJL_CLASSLOADER, false);

Hello @liach, should this instead be using the (application supplied) `loader` returned by the call to `ProxyGenerator.getClassLoader()` or maybe the `loader` member in the `ProxyGenerator` itself?

test/jdk/java/lang/reflect/Proxy/LazyInitializationTest.java line 56:

> 54: 
> 55:         value.m(new Parameter());
> 56:         Assert.assertTrue(initialized, "parameter type initialized after instantiation");

> "parameter type initialized after instantiation"

Since this is the text that gets displayed/reported when the assertion fails, should this instead be "parameter type not initialized"?

-------------

PR: https://git.openjdk.java.net/jdk/pull/8800


More information about the core-libs-dev mailing list