You've presented a new fact about A.

Yes, if A is going to dereference the object graph starting from the object created by C's code (presumably as an instance of one of C's classes) and passed to B's code, then B would need to read all the modules containing the classes of objects in the object graph.

And all those modules need to export the classes' packages to B as well.

And no, B's code cannot configure those other modules to export packages to it. This is a point of real tension between strong encapsulation and serialization libraries which I'm sure the Expert Group will take up.

Alex

On 12/3/2015 11:58 AM, Rafael Winterhalter wrote:
As I understand it, this is not sufficient.

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?

2015-12-03 20:48 GMT+01:00 Alex Buckley <alex.buck...@oracle.com
<mailto:alex.buck...@oracle.com>>:

    "needs to find all modules potentially involved" ? Module B needs to
    configure readability to solely the module containing the class that
    A's code (well, the code-that-used-to-be-A-but-is-now-part-of-B)
    wishes to access reflectively. Here it is:
    objFromC.getClass().getModule().

    Alex

    On 12/3/2015 11:43 AM, Rafael Winterhalter wrote:

        But then library B needs to find all modules potentially
        involved. With
        the classical example of a serialization library that traverses
        a full
        object graph, this would require B to do the same for anytime an
        object
        is handed to the shaded dependency. To me that appears impractical.

        Am 03.12.2015 8:37 nachm. schrieb "Alex Buckley"
        <alex.buck...@oracle.com <mailto:alex.buck...@oracle.com>
        <mailto:alex.buck...@oracle.com <mailto:alex.buck...@oracle.com>>>:

             Yes, A's reflective access to C's classes will fail, due to the
             action of B's author in grabbing and shading A.

             Module B is responsible for configuring its (B's)
        readability to the
             module containing C's classes (be that a named module if C
        has been
             modularized, or the unnamed module if C is still a JAR on the
             classpath).

             Module B can achieve this with a single call to
        j.l.r.Module::addReads.

             Alex

             On 12/3/2015 11:19 AM, Rafael Winterhalter wrote:

                 Sorry, I realize that I was not precise.

                 Assuming that pre-module library A is shaded by modularized
                 library B. User
                 code C is then using library B. Internally, library B
        passes
                 objects to
                 library A that is using reflection on C without being
        aware of
                 the module
                 boundary. Would this now fail as library A is now part
        of B's
                 module?
                 Am 03.12.2015 8:10 nachm. schrieb "Alan Bateman"
                 <alan.bate...@oracle.com
        <mailto:alan.bate...@oracle.com> <mailto:alan.bate...@oracle.com
        <mailto:alan.bate...@oracle.com>>>:


                     On 03/12/2015 18:30, Rafael Winterhalter wrote:

                         As a follow-up question. What if I need to import a
                         library into my
                         namespace and therewith module? ("shaded
        dependencies")
                         This is a quite
                         common practice to avoid version conflicts.

                         Would for example the reflection semantics for
        these
                         classes change? Or
                         would the byte code level serve as a fallback?
        (But then
                         the mentioned
                         "modularity for pre-9 libraries" would not work.)

                         Can you expand the example a bit? I assume the
        uber JAR
                         has the

                     dependences (in renamed packages) but those
        packages are not
                     exported. In
                     that case then none of the types in the shaded
        dependences
                     will be
                     accessible outside of the module. Within the
        module, which
                     includes the
                     shaded dependences, then all public types are
        available to
                     code in the
                     module, doesn't matter if the reference is static
        or core
                     reflection.

                     -Alan


Reply via email to