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.