Hi Peter, Mandy,

On 31/07/2019 09:44, Peter Levart wrote:
Expanding on this a little. The javadocs of MethodHandles.Lookup starts talking about the Lookup factory methods methods and their equivalence to bytecode instructions, but then present the equivalence between find* and Java source code (which is OK given that translation to bytecode is known) followed by equivalence between unreflect* and reflective invocations. Public reflection API does not implement the equivalent behavior to unreflectSpecial. So perhaps, this line only could present the equivalence in terms of Java code like findSpecial does with a comment stating that there's no equivalence with reflective invocation API. For example:

      * <tr>
      *     <th scope="col"><a id="equiv"></a>lookup expression</th>
      *     <th scope="col">member</th>
      *     <th scope="col">bytecode / reflection behavior</th>

Added "/ reflection" above; and:

      * <tr>
     *     <th scope="row">{@link java.lang.invoke.MethodHandles.Lookup#unreflectSpecial lookup.unreflectSpecial(aMethod,this.class)}</th>      *     <td>{@code T m(A*);}</td><td>{@code (T) super.m(arg*); // no equivalent reflective invocation}</td>
      * </tr>

Yes - I would find this description better.
Additionally maybe it could say that the MH returned is
equivalent to that returned by `findSpecial(aMethod.getDeclaringClass(), aMethod.getName(), MT, this.class)` - as there's no reflection equivalent?

On 7/30/19 4:47 PM, Mandy Chung wrote:

Think about aMethod is a protected method inherited from its superclass T.  To invoke aMethod, the receiver must be an instance of T or a subclass of T.

Ah - that's a very good explanation for the nature of the fix itself.
Thanks for that! But my comment was about virtual vs special invocation as Peter noted.

best regards,

-- daniel

Reply via email to