Converting MethodHandle into reflective Method instance
MacGregor, Duncan (GE Energy Management)
duncan.macgregor at ge.com
Fri Jan 11 09:30:00 PST 2013
On 11/01/2013 14:16, "Eric Bodden" <eric.bodden at ec-spride.de> wrote:
>Thanks Duncan, for the fast response.
>
>To clarify, when you say...
>> The call site created by a bootstrap method will normally
>> change its own target during execution into a a guardWithTest chain
>>which
>> would dispatch to several targets, and when it gets too big for that may
>> start fetching and directly invoking other method handles or passing
>>them
>> back to an exact invoker.
>... do you mean that this is implemented with in the java.lang.invoke
>API or do you mean that client implementations using that API will
>normally generate such a guardWithTest chain?
Yes. :-) MutableCallSites (which are specified in the java.lang.invoke
APIs) support setTarget() to set the callsite's target, and there are a
set of methods on java.lang.invoke.MethodHandles for combining method
handles in various ways. I would expect almost all language
implementations using method handles would make quite heavy use of those
APIs, and most will bootstrap to a call site with some sort of fallback
target and change that target on the first invocation to a guardWithTest.
>> I think your only real option is intercept the calls that get the method
>> handles in the first place, so you'd need to transform most calls to
>> Lookup objects and unreflect(). That shouldn't be too hard a bit of code
>> transformation to do.
>
>That's a good idea which we can try. Unfortunately it will require
>modifications to the JDK. That's something I was trying to avoid.
Could you not do this by transforming the code outside the JDK that calls
those methods? I assume you have to do something similar to existing code
which uses reflection to avoid it bypassing your advice-execution code.
Oh, and I've just realised you'll also have to do something about any
MethodHandles that have been compiled into a classes constant pool as
well. Some of those will be the bootstrap methods for invokeDynamic
instructions, but other things could have been stuffed in their.
Regards, Duncan.
More information about the mlvm-dev
mailing list