RFR: 8271820: Implementation of JEP 416: Reimplement Core Reflection with Method Handle [v16]
Alan Bateman
Alan.Bateman at oracle.com
Sun Nov 14 07:19:30 UTC 2021
On 14/11/2021 00:59, Claes Redestad wrote:
> :
> @martin-g mutating static final fields with reflection `setAccessible(true)` is an ugly hack with partially undefined behavior that can lead to all manners of bugs.. but I think this is an unintentional behavior change.
>
> @mlchung should verify, but it looks like the `MethodHandles.unreflect` API used internally in the new implementation is slightly stricter and ignores the `setAccessible(true)` for the trusted finality check. This added strictness is established behavior for the public `MethodHandles.unreflect` API point, which seem perfectly fine there (the MH API is strictly adhering to regular java access rules). For this new reflection implementation we should probably make an exception to that strictness to be perfectly backwards compatible.
If I read this correctly, a wicked Wicket test is making use of a
private method in java.lang.Class so it can hack jlr.Field and change
its internal "modifiers" field. I don't think the JDK should be expected
to keep crazy hacks like this working from release to release.
Are there many Wicket tests trying to modify static field fields? Have
you looked at using an agent to drop the final modifier from these
fields when loading the classes?
-Alan
More information about the core-libs-dev
mailing list