RFR: 8284942: Proxy building can just iterate superinterfaces once [v2]

Mandy Chung mchung at openjdk.java.net
Thu May 19 20:10:45 UTC 2022


On Thu, 21 Apr 2022 03:44:18 GMT, liach <duke at openjdk.java.net> wrote:

>> Currently, in ProxyBuilder::mapToModule and ProxyBuilder::defineProxyClass, the interfaces are iterated twice. The two passes can be merged into one, yielding the whole proxy definition context (module, package, whether there's package-private interface) when determining the module.
>> 
>> Split from #8278. Helpful for moving proxies to hidden classes, but is a good cleanup on its own.
>
> liach has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Don't need to complexify module cache

src/java.base/share/classes/java/lang/reflect/Proxy.java line 498:

> 496:             new ClassLoaderValue<>();
> 497: 
> 498:         private record ProxyContext(Module module, String pkg, boolean packagePrivate) {}

This represents the context for a proxy class.   It seems `ProxyClassContext` would be clearer.   I suggest the context to have the accessFlags for a proxy class rather than the boolean whether it's package private.   The constructor should check that it must be 0 or `Modifier.PUBLIC`.   `FINAL` will be added to the access flags when it generates the proxy class.

src/java.base/share/classes/java/lang/reflect/Proxy.java line 766:

> 764:          * Reads edge and qualified exports are added for dynamic module to access.
> 765:          */
> 766:         private static ProxyContext setupContext(ClassLoader loader,

Perhaps name this method `proxyClassContext` that returns `ProxyClassContext`.

src/java.base/share/classes/java/lang/reflect/Proxy.java line 831:

> 829:             // All proxy interfaces are public.  So maps to a dynamic proxy module
> 830:             // and add reads edge and qualified exports, if necessary
> 831:             var context = getDynamicModuleContext(loader, nonExported);

I suggest to keep the `getDynamicModule` method as creating a dynamic module of a given class loader is a clear function.   The context can be created in this method body.


            var targetModule = getDynamicModule(loader);
            var pkgName = nonExported ? PROXY_PACKAGE_PREFIX + '.' + targetModule.getName()
                                      : targetModule.getName();
            var context = new ProxyClassContext(targetModule, pkgName, Modifier.PUBLIC);

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

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


More information about the core-libs-dev mailing list