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