When you teleport the lookup from module R class C to another module M class D, the cross-module access check ensures that the resulting Lookup has access to public types that both R/C and M/D can access (i.e. their intersection).

The table in the cross-module access checks section at:
https://download.java.net/java/early_access/jdk20/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#module-access-check

describes the allowed modes of the resulting Lookup after teleporting.

On 8/25/22 11:24 AM, Rudy De Busscher wrote:
Hi All,

I'm playing around with MethodHandle.lookup and LambdaMetafactory to have some generic utility method to access fields (through the getters and setters) of some arbitrary class. (as alternative for reflection as this should be faster)

Code is working fine in classpath mode, but when using Java modules, I get errors saying 'access to public member failed' although module info exports the class.

I believe this is by design because I read the following sentence in the javadoc of MethodHandles.Lookup "*Teleporting to some third module drops all accesses. *"

Yes.   Teleporting across modules can only decrease access but cannot increase it.


I seek confirmation that it is indeed not possible what I'm trying (JDK 11/JDK 17)

_Setup_

Module R, Class with calls to MethodHandle.lookup and LambdaMetafactory

Module M, contains simple pojos, public setters and getters for each property. module info contains exports and open clauses for the pojo package(s).

Module App contains the main method, calling the utility class in Module R with Pojos of Module M.

_Code_

Since I have

/MethodHandles.Lookup lookup = MethodHandles.publicLookup().in(beanClass);/


A public Lookup has UNCONDITIONAL mode that can access public type in all modules when the type is in a package that is exported unconditionally.

Teleporting to a different module does not change its allowed mode.


Within a class of Module R, called from Module App, where beanClass is a class within M I assume I get this error due to the 'teleporting to third module'

access to public member failed: be.atbash.poc.reflection.Pojo.getData()String/invokeVirtual, from be.atbash.json.accessor.FastPropertyMemberAccessor (module reflection)


Is be.atbash.poc.reflection.Pojo exported unconditionally?


When I use


MethodHandles.Lookup lookup = MethodHandles.lookup().in(beanClass);

I have as error


symbolic reference class is not accessible: class be.atbash.poc.reflection.Pojo, from be.atbash.poc.reflection.Pojo/noaccess (module model)


which also indicate the access check is an issue ( xxx/noaccess)


Is this error message from JDK 11?  Is it a different message when running with JDK 17?

Mandy



_Question_


Thanks for any additional insight I might miss or confirmation it is not possible what I try when using Modules.

Reply via email to