is ClassLoader.loadClass() supposed to work on module-info classes?
Rafael Winterhalter
rafael.wth at gmail.com
Thu Dec 3 19:58:46 UTC 2015
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.buckley at 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.buckley at oracle.com <mailto:alex.buckley at 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.Bateman at oracle.com <mailto:Alan.Bateman at 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
>>
>>
More information about the jigsaw-dev
mailing list