On Tue, 19 Nov 2024 16:35:44 GMT, Chen Liang <li...@openjdk.org> wrote:

>> src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java
>>  line 430:
>> 
>>> 428:         // Single parameter of declared type Object[]
>>> 429:         Class<?>[] parameters = 
>>> reflectionFactory.getExecutableSharedParameterTypes(method);
>>> 430:         return parameters.length == 1 && parameters[0] == 
>>> Object[].class;
>> 
>> Would it be possible to check for the `PolymorphicSignature` annotation 
>> instead?
>
> I think the main problem with annotation is that annotation creation needs to 
> use `java.lang.reflect.Proxy`, which is unavailable until module system is 
> initialized. Extra allocations are costs too, while checks here only reuse 
> existing objects.
> 
> In fact, I don't think Java's core libraries ever check for annotations, and 
> the annotation's support class, `jdk.internal.reflect.ConstantPool`, has 
> always been only loaded but never initialized in a simple hello world program 
> since Java 5.

In fact, another solution I have contemplated is to update 
`JavaLangInvokeAccess` implementations. 4 methods in it, 
`unreflectConstructor`, `unreflectField`, `findVirtual`, and `findStatic`, are 
exclusively used by core reflection.

That solution proposes to bypass `findVirtualForMH`/`findVirtualForVH` and 
bypass `setVarargs(MemberName)` in 
`getDirectMethodCommon`/`getDirectConstructorCommon` in these internal hooks.

But I think this may be too invasive and unfriendly to backports (also note: 
backport to 21 isn't clean, there is a small conflict in doc comments), and 
using native instead of MH for these 2 corner cases shouldn't be too big of a 
performance concern.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22169#discussion_r1848704448

Reply via email to