Review Request: JDK-8209005: Lookup.unreflectSpecial fails for default methods when Lookup.findSpecial works
Daniel Fuchs
daniel.fuchs at oracle.com
Tue Jul 30 10:22:10 UTC 2019
Hi Mandy,
380 * <th scope="row">{@link
java.lang.invoke.MethodHandles.Lookup#unreflectSpecial
lookup.unreflectSpecial(aMethod,this.class)}</th>
381 * <td>{@code T m(A*);}</td><td>{@code (T)
aMethod.invoke(this, arg*);}</td>
Is this exactly true? I mean - if `this` is an instance of
a subclass of `aMethod.getDeclaringClass()`, and if that
subclass overrides `aMethod`, then I would expect
`aMethod.invoke(this, arg*)` to execute the bytecode
of the method defined in the subclass.
If I'm not mistaken, the test does expect that the
bytecode in the super class is executed instead.
I suspect that `unreflectSpecial` can only be specified
in terms of `findSpecial`. But maybe I'm missing something.
I'm not too familiar with the intricacies of MethodHandle.
best regards,
-- daniel
On 26/07/2019 18:41, Mandy Chung wrote:
> Daniel noticed that `unreflectSpecial` is missing in the "Lookup Factory
> Methods" section in the class spec. In fact there are a duplicated
> `lookup.unreflect(aMethod)` row that might originally be for
> `unreflectSpecial`. I fix the javadoc in this patch:
>
> http://cr.openjdk.java.net/~mchung/jdk14/8209005/webrev.01/
>
> Mandy
>
> On 7/25/19 1:12 PM, Mandy Chung wrote:
>> This patch fixes Lookup.unreflectSpecial to pass the declaring class
>> of Method being unreflected (rather than null) so that it can
>> accurately check if the special caller class is either the lookup
>> class or a superinterface of the declaring class.
>>
>> Webrev:
>> http://cr.openjdk.java.net/~mchung/jdk14/8209005/webrev.00/index.html
>>
>> The test runs in both unnamed module and named module to cover
>> JDK-8209078 which has been resolved by JDK-8173978.
>>
>> thanks
>> Mandy
>
More information about the core-libs-dev
mailing list