API Updates: 8191116: [Nestmates] Update core reflection, MethodHandle and varhandle APIs to allow for nestmate access
David Holmes
david.holmes at oracle.com
Tue Jan 30 20:51:32 UTC 2018
Hi Dan,
Thanks for looking at this so quickly.
On 31/01/2018 12:19 AM, Daniel Heidinga wrote:
> Thanks David.
> These changes all seem reasonable. I was going to complain about
> changing 'will occur' to 'may occur' as 'may' make makes it difficult to
> determine when it will vs won't occur but I think it's correct in this case.
It's really non-normative anyway. The real process is described in JLS
15.12.4.4, so if you wanted to know for sure case-by-case then you'd
need to refer back to that.
David
-----
> --Dan
>
> ----- Original message -----
> From: David Holmes <david.holmes at oracle.com>
> Sent by: "valhalla-spec-experts"
> <valhalla-spec-experts-bounces at openjdk.java.net>
> To: valhalla-spec-experts at openjdk.java.net
> Cc:
> Subject: API Updates: 8191116: [Nestmates] Update core reflection,
> MethodHandle and varhandle APIs to allow for nestmate access
> Date: Tue, Jan 30, 2018 4:55 AM
>
> I've gone through the API specifications for core reflection,
> MethodHandles and VarHandles to see what changes are needed to
> accommodate nestmates and the related invocation rule changes. Turns
> out there is very little needed and most of what there is is
> non-normative, just correcting or clarifying particular things. For
> VarHandle nothing is needed as it defers all access checking to
> MethodHandle.Lookup.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8191116
> <https://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.openjdk.java.net_browse_JDK-2D8191116&d=DwMFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=LBQnmyrHQkEBElM8bAxhzfwLG2HbsYDdzEznFrQoob4&m=PbzMXdwGz8_Tt-pH8pku2uAOgfXl4NIVy58_7jK3rRg&s=VWdi_YhjdK6C_lkCp3BfInxLR9CoDESlYiHUKD-F3_g&e=>
>
> Webrev: http://cr.openjdk.java.net/~dholmes/8191116/webrev/
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__cr.openjdk.java.net_-7Edholmes_8191116_webrev_&d=DwMFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=LBQnmyrHQkEBElM8bAxhzfwLG2HbsYDdzEznFrQoob4&m=PbzMXdwGz8_Tt-pH8pku2uAOgfXl4NIVy58_7jK3rRg&s=EAQJ2EaJNAHuSFbIwnMbVq-nbhvEnWugrV2t4KpDNbA&e=>
>
>
> Core reflection changes:
>
> These are minimal as core reflection already expresses all access
> control in terms of "Java language access control" which already
> allows for nestmate access.
>
> - java/lang/reflect/AccessibleObject.java
> * <p> Java language access control prevents use of private
> members outside
> - * their class; package access members outside their package;
> protected members
> + * their top-level class; package access members outside their
> package; protected members
>
> This corrects the definition of private access in the Java language.
>
> - java/lang/reflect/Method.java
> * using dynamic method lookup as documented in The Java Language
> - * Specification, Second Edition, section 15.12.4.4; in particular,
> - * overriding based on the runtime type of the target object will
> occur.
> + * Specification, section 15.12.4.4; in particular,
> + * overriding based on the runtime type of the target object may occur.
>
> Removed unnecessary reference to "Second Edition". Changed 'will
> occur' to 'may occur' to account for the different forms of
> invocation that may apply.
>
>
> MethodHandle API Changes:
>
> - java/lang/invoke/MethodHandle.java
> * A non-virtual method handle to a specific virtual method
> implementation
> * can also be created. These do not perform virtual lookup based on
> * receiver type. Such a method handle simulates the effect of
> - * an {@code invokespecial} instruction to the same method.
> + * an {@code invokespecial} instruction to the same non-private method;
> + * or an {@code invokevirtual} or {@code invokeinterface}
> instruction to the
> + * same private method (as applicable).
>
> I tried to clarify that non-virtual invocations are not limited to
> invokespecial - as private invocations via invokevirtual or
> invokeinterface are also non-virtual.
>
> - java/lang/invoke/MethodHandles.java
>
> * <p>
> - * In some cases, access between nested classes is obtained by
> the Java compiler by creating
> - * an wrapper method to access a private method of another class
> - * in the same top-level declaration.
> + * Since JDK 11 the relationship between nested types can be
> expressed directly through the
> + * {@code NestHost} and {@code NestMembers} attributes.
> + * (See the Java Virtual Machine Specification, sections 4.7.28
> and 4.7.29.)
> + * In that case, the lookup class has direct access to private
> members of all its nestmates, and
> + * that is true of the associated {@code Lookup} object as well.
> + * Otherwise, access between nested classes is obtained by the
> Java compiler creating
> + * a wrapper method to access a private method of another class
> in the same nest.
> * For example, a nested class {@code C.D}
>
> Updated the nested classes description to cover legacy approach and
> new nestmate approach.
>
> - * {@code C.E} would be unable to those private members.
> + * {@code C.E} would be unable to access those private members.
>
> Fixed typo: "access" was missing.
>
> * <em>Discussion of private access:</em>
> * We say that a lookup has <em>private access</em>
> * if its {@linkplain #lookupModes lookup modes}
> - * include the possibility of accessing {@code private} members.
> + * include the possibility of accessing {@code private} members
> + * (which includes the private members of nestmates).
> * As documented in the relevant methods elsewhere,
> * only lookups with private access possess the following
> capabilities:
> * <ul style="font-size:smaller;">
> - * <li>access private fields, methods, and constructors of the
> lookup class
> + * <li>access private fields, methods, and constructors of the
> lookup class and its nestmates
>
> Clarify that private access includes nestmate access.
>
> - * access all members of the caller's class, all public types
> in the caller's module,
> + * access all members of the caller's class and nestmates, all
> public types in the caller's module,
>
> Ditto.
>
> * When called, the handle will treat the first argument as a
> receiver
> - * and dispatch on the receiver's type to determine which method
> + * and, for non-private methods, dispatch on the receiver's
> type to determine which method
> * implementation to enter.
> + * For private methods the named method in {@code refc} will be
> invoked on the receiver.
>
> Clarify dispatch process for private versus non-private.
>
> * @throws IllegalAccessException if access checking fails,
> * or if the method is {@code
> static},
> - * or if the method is {@code
> private} method of interface,
>
> This is the only actual spec change - it's no longer illegal for
> findVirtual to be used to find a private interface method.
>
> Thanks,
>
> David
>
>
More information about the valhalla-spec-experts
mailing list