JDK-6824466 java.lang.reflect.Method should use java.lang.invoke.MethodHandle

Johannes Kuhn info at j-kuhn.de
Mon Feb 1 17:59:44 UTC 2021


Thanks Mandy.

Yes, the 3 prototypes I mentioned were yours, Peter Levart's, and my own.
(My prototype is at 
https://github.com/DasBrain/jdk/tree/reflection-MHaccessors - I hit an 
boostrap problem, build a workaround that I don't really like, so I 
stopped working on that.)

I agree on your goals, they are the same as mine.

For the constructor story, well, that is a prerequisite for the hidden 
proxy classes. I'll take an other look at your implementation, and maybe 
open a pull request against your repo.

Current approach is to keep the scope small - just replacing the old 
generated accessors with method handle based ones.

Even this "small" change is IMHO worthwhile:

* Getting rid of the old MethodAccessorGenerator (I don't want to 
maintain it, and if I had to, then moving to ASM would be a step forward)
* Better performance on calling methods from hidden classes. (Loom 
doesn't like native frames on the stack)
* Prerequisite for further enchantments, such as hidden proxy classes, 
alternatives for reflective @CS and possible performance improvements 
using @Stable/@ForceInline.

It's just - it's an old bug, and other people already did try some stuff 
on it. So I try to learn from their experience and try to understand 
what roadblocks they hit first. No need to repeat the mistakes others 
already made.

- Johannes

On 01-Feb-21 18:37, Mandy Chung wrote:
> Hi Johannes,
> 
> I believe you are aware of the prototype I'm working on:
> https://github.com/mlchung/jdk/tree/method-invoke
> 
> My prototype so far replaces method and fields but not constructors 
> yet.   You are welcome to contribute.
> 
> My main motivation of doing this is to get rid of the old clunky 
> bytecode generator and core reflection will be built atop on method 
> handles.   This would greatly simplify the work to add support for a new 
> feature for example Valhalla primitive classes only in method handles.  
>    I plan to keep the native method accessor  for startup use (or switch 
> to method handles when module system is initialized).
> 
> Mandy
> 
> On 2/1/21 6:50 AM, Johannes Kuhn wrote:
>> While implementing a prototype for JDK-8242888 (Convert dynamic proxy 
>> to hidden classes) I came across the problem that hidden classes can't 
>> be mentioned in the constant pool, breaking the constructor for 
>> serialization.
>>
>> To remedy that problem, I used a MHConstructorAccessor which delegates 
>> the actual work to MethodHandles - not unlike what JDK-6824466 suggests.
>>
>> As there has been previous work in that area, (I am aware of at least 
>> 3 independently developed prototypes for that bug/enchantment) I would 
>> like to ask a few questions around it:
>>
>>
>>
>> 1) What are the challenges?
>>
>> From the bug I could infer, that it's cold start is slower than 
>> NativeMethodAccessor, but still faster than the generated (bytecode 
>> spinning) accessors.
>>
>> 2) Are there any roadblocks that prevent replacing the 
>> MethodAccessorGenerator with accessors that use MethodHandles?
>>
>> From my limited tests, it appears to work well enough.
>>
>> 3) Should I try to implement it?
>>
>>
>>
>> From my POV, replacing MethodAccessorGenerator with accessors that 
>> delegate to MethodHandles has a few benefits:
>>
>> * Support for hidden classes. (Currently fallback to native accessors)
>> * Removal of MethodAccessorGenerator (which is old and clunky)
>>
>> - Johannes
> 


More information about the core-libs-dev mailing list