RFR: 8294961: Convert java.base/java.lang.reflect.ProxyGenerator to use the Classfile API to generate proxy classes [v6]
Mandy Chung
mchung at openjdk.org
Thu Mar 16 22:05:48 UTC 2023
On Thu, 16 Mar 2023 15:20:27 GMT, Chen Liang <liach at openjdk.org> wrote:
>> Possible extensions of `ClassHierarchyResolver` factories, or maybe even extensions of the default resolver are on the table and I just planned to open this discussion.
>>
>> Here is specific case where original code passes `ClassLoader` down to to the ASM engine for class hierarchy resolution based on class loading.
>>
>> Classfile API has more flexibility in that area and can resolve class hierarchy based on provided minimal information. Default class hierarchy resolution is fast-scanning of classfiles provided by ClassLoader as resources. It is not necessary to resolve all dependencies nor load the classes. However this is one of the cases where I'm not sure the default does it right. The above code turns default class hierarchy resolution back to the original class-loading approach.
>>
>> In `InnerClassLambdaMetafactory` I didn't observed any `ClassLoader` beeing passed down to ASM, so it rely on the defaults.
>>
>> The right solution may be to extend the default class hierarchy resolution to fall back to class-loading when the resource form of the class is not available. A factory method can just replicate the same behavior with provided different `ClassLoader`.
>>
>> I'm open to any comments and suggestions.
>
> I was thinking of implementing a class resolution via Reflection API with the `MethodHandles.Lookup` passed into `LambdaMetafactory` for correctness. Could it be that Lambda bytecode is too simple (as it's just calling a method handle in an instance method and a constructor, in a class extending Object and implementing a few interfaces) so the class hierarchy resolution wasn't critical?
> In InnerClassLambdaMetafactory I didn't observed any ClassLoader beeing passed down to ASM, so it rely on the defaults.
This is right. A lambda proxy is defined with the same class loader of the caller's class.
For dynamic proxies, it is generated using the class loader specified via `newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)` which should be used for class resolution.
-------------
PR: https://git.openjdk.org/jdk/pull/10991
More information about the core-libs-dev
mailing list