When the author of B decided to shade A, it became B's responsibility to configure the readability needed by A's reflective code.

"But B doesn't know anything about how A works. The shading was only to use a different version of A than was observable on the modulepath."

OK, then shading A wasn't the right solution.

One possibility is to continue renaming A's classes, but to put them in Aprime.jar on the modulepath. That would generate an automatic module Aprime which B could require. The Aprime module reads everything, so its reflective inspection of C's classes et al will work -- until an object of some module-private class is reached.

So, I've solved your multiple-versions-of-A problem but I haven't solved your encapsulation problem. Again, the tension between strong encapsulation and serialization libraries is something I'm sure the Expert Group will take up.

Alex

On 12/3/2015 12:43 PM, Rafael Winterhalter wrote:
The point is that A is shaded. It is compiled prior to Java 9 and not aware
of modules or Java 9 APIs. Therefore, it does not add read edges.

B only imports A to avoid conflicts with other versions of A where A
implicitly becomes a part of module B.
Am 03.12.2015 9:37 nachm. schrieb "Alan Bateman" <alan.bate...@oracle.com>:

On 03/12/2015 19:58, Rafael Winterhalter wrote:

:

Assuming A is a serialization library: If the object of C contains an
instance encapsulated by D, then B would need to make sure that it can
read
C and D before handing the instance to A. For this it would of course be
necessary to understand the inner workings of A. This is trivial for a
serialization library but in the general case this involves more effort
and
is difficult to accomplish without runtime errors.

Is that incorrect?

The B code doesn't need to do anything special here, it just passes
references to A code (in the same module). If the A code is doing
serialization then it's walking object graphs and might have to add some
transient read edges (via jlr.Module::addReads) as it goes. If the walk
leads to it trying to access types that aren't public or aren't in packages
exported to module B then it will get an IllegalAccessException, that is to
be expected. So I don't think there is any specific to shading or uber JARs
in this example.

-Alan.

Reply via email to