On 16/01/2025 00:28, Code Ranger wrote:
Please, consider the following situation:

The boot layer contains moduleA, which has the following line in module-info: "opens com.company.a.foo to com.google.gson;"
The child layer contains gson.

And this is what I get:

java.lang.reflect.InaccessibleObjectException: Unable to make field private ... com.company.a.foo.Bar accessible: moduleA does not "opens com.company.a.foo" to module com.google.gson

If I do "opens com.company.a.foo;" then everything works fine, but it is not what I would like to do.

Can someone confirm if this is expected behavior? Is this a bug, or does opens/exports moduleA.X to moduleB only work when moduleA and moduleB are in the same layer?

Assuming com.google.gson wasn't observable at compile-time, then I assume you got a warning at compile-time too.

When creating a module layer, qualified exports/opens are reified to export or open to the target module in the current or parent layers. Qualified exports to modules that aren't found are ignored. The details are specified in the ModuleLayer class description. So yes, this is expected behavior.

Maybe someone familiar with Gson can help but it seems to use "type adapters" for cases like this. If you really need com.google.gson in a child layer doing deep reflection on classes in a parent or boot layer then it require cooperation from code in the parent layer.

-Alan




Reply via email to