Suggestion: allow accessible reflection on protected methods of exported types.

Jochen Theodorou blackdrag at gmx.org
Tue Jan 10 13:51:53 UTC 2017



On 10.01.2017 12:28, Uwe Schindler wrote:
> Hi,
>
> just coming to the example you brought, because I exercised this a week ago:
>
>> [...] For example... can you
>> call Object#clone on Object using MethodHandles? I actually did not try
>> this, but since the method is protected and in a module I would assume
>> no. You had been able to do so by reflection. Let us not discuss about
>> if that makes sense or not. It just shows for me that (ii) is simply not
>> there.
>
> Hi, it is impossible to call Object#clone with MethodHandles. Not even in the same module unless you unreflect an accessible reflective method. I tried something similar last week to fix the Cglib issues with invoking protected ClassLoader#defineClass. The idea was "the standard MethodHandle" trick:
>
> Create an abstract subclass of ClassLoader - just to have a static initialization block. In this static block you get a (private) Lookup object to lookup the protected defineClass method. Which works phantastically! As it is virtual, the MethodHandle should now allow to call the method with any ClassLoader as first parameter (the receiver of virtual method). This works for all methods, but not protected ones. If you read the Javadocs it is in the specs. For protected methods, the methodhandle is "modified" and the receiver argument is casted to the Lookup's class. And because of this you get a ClassCastException if you don't call with a receiver that is assignable to the current Lookup's class.
>
> Too stupid, the designers of MethodHandles were way too intelligent :-)
>
> See my investigations:
> https://github.com/cglib/cglib/issues/93#issuecomment-269255311

I guess the trick is that I am using reflection to get a Lookup object 
that has full priviledges... a trick that does no longer work in current 
jigsaw


bye Jochen


More information about the jigsaw-dev mailing list