RFR: 8271820: Implementation of JEP 416: Reimplement Core Reflection with Method Handle [v16]
Martin Grigorov
duke at openjdk.java.net
Sun Nov 14 19:57:43 UTC 2021
On Wed, 27 Oct 2021 20:16:54 GMT, Mandy Chung <mchung at openjdk.org> wrote:
>> This reimplements core reflection with method handles.
>>
>> For `Constructor::newInstance` and `Method::invoke`, the new implementation uses `MethodHandle`. For `Field` accessor, the new implementation uses `VarHandle`. For the first few invocations of one of these reflective methods on a specific reflective object we invoke the corresponding method handle directly. After that we spin a dynamic bytecode stub defined in a hidden class which loads the target `MethodHandle` or `VarHandle` from its class data as a dynamically computed constant. Loading the method handle from a constant allows JIT to inline the method-handle invocation in order to achieve good performance.
>>
>> The VM's native reflection methods are needed during early startup, before the method-handle mechanism is initialized. That happens soon after System::initPhase1 and before System::initPhase2, after which we switch to using method handles exclusively.
>>
>> The core reflection and method handle implementation are updated to handle chained caller-sensitive method calls [1] properly. A caller-sensitive method can define with a caller-sensitive adapter method that will take an additional caller class parameter and the adapter method will be annotated with `@CallerSensitiveAdapter` for better auditing. See the detailed description from [2].
>>
>> Ran tier1-tier8 tests.
>>
>> [1] https://bugs.openjdk.java.net/browse/JDK-8013527
>> [2] https://bugs.openjdk.java.net/browse/JDK-8271820?focusedCommentId=14439430&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14439430
>
> Mandy Chung has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 43 commits:
>
> - fix copyright header and typo
> - improve documentation of AccessorUtils
> - Merge branch 'master' of https://github.com/openjdk/jdk into reimplement-method-invoke
> - Fall back to the VM native reflection support if method handle cannot be created
> - fix bug id in test
> - Merge
> - Merge branch 'master' of https://github.com/openjdk/jdk into reimplement-method-invoke
> - Merge branch 'master' of https://github.com/openjdk/jdk into reimplement-method-invoke
> - Separate paramFlgas into paramCount and flags fields
> - Minor cleanup. Improve javadoc in CallerSensitiveAdapter
> - ... and 33 more: https://git.openjdk.java.net/jdk/compare/9a3e9542...46cb306b
Thank you for the comments!
There is no need to be harsh though! We just made use of old Reflection APIs. They were working for many years and according to StackOverflow Apache Wicket is not the only one doing this!
In our case it is done in a test case, so it is easy to rework it.
> Are there many Wicket tests trying to modify static field fields?
No! We have just one failing test with JDK 18 b23.
In someone else's case it might be needed to "hack" a third party library.
As a good citizen I'm reporting it back to you!
-------------
PR: https://git.openjdk.java.net/jdk/pull/5027
More information about the core-libs-dev
mailing list