Implied readability + layers

Alex Buckley alex.buckley at oracle.com
Fri Nov 6 00:53:03 UTC 2015


On 11/5/2015 2:28 PM, Peter Levart wrote:
> On 11/05/2015 10:21 PM, Alex Buckley wrote:
>>>> If implied readability is taken "symbolically", the same
>>>> caveats apply to one or the other form - they are just
>>>> different forms of expressing the same thing.
>>>>
>>> As you can see this is currently is not case.
>>
>> It is the case for modules in the same layer. For modules in different
>> layers, the fundamental design of class loading (initiating loader v.
>> defining loader) means that explicit readability within a layer
>> "dominates" implicit readability across layers.
>
> You mean explicit readability within a layer must dominate implicit
> readability across layers unless we want the possibility of strange
> ClassCastExceptions like "com.bar.Type can not be cast to com.bar.Type"
> and similar?

Yes.

> So what is written in javadoc for:
>
>      public static Configuration resolve(ModuleFinder beforeFinder,
>                                          Layer parent,
>                                          ModuleFinder afterFinder,
>                                          Collection<String> roots)
>
>       * <p> Each root module is located using the given {@code beforeFinder}
>       * and if not found, using the given {@code afterFinder}. Their
> transitive
>       * dependences are located using the given {@code beforeFinder}, or
> if not
>       * found then the parent {@code Layer}, or if not found then the given
>       * {@code afterFinder}. Dependences located in the parent {@code Layer}
>       * are resolved no further. </p>
>
> ...is true only for explicit dependencies? If "transitive" dependency is
> implicit, then the order is: parent Layer, beforeFinder, afterFinder ?

I believe that "transitive" dependencies means "the set of explicit 
dependencies mentioned by 'requires' clauses all the way down to 
java.base". Implicitly read dependencies appear later, and are dominated 
by the explicit dependencies that have already been resolved.

> Or is it just so that the module definition is searched in the specified
> order, but classes are always loaded according to ClassLoader hierarchy
> and their delegation strategy, regardless of Layer configurations that
> just sit above them and must be aligned with them?

It goes without saying that classes are always loaded according to the 
class loaders' delegation strategy (e.g. "a hierarchy") and the JVM's 
loaded class cache (where the "initiating loader" info I mentioned 
earlier is stored). Layers don't change that, so they need to align with 
loader delegation rather than the other way around.

> So we can achieve the desired effect if we construct our own
> ClassLoader(s) that delegate according to
> beforeFinder/parentLayer/afterFinder ?

I'm not really sure what the desired effect is at this point, but yes 
the loaders passed to a layer should delegate in accordance with the 
resolved graph, and yes the graph would have been resolved on the basis 
of beforeFinder-then-parentLayer-then-afterFinder.

Alex


More information about the jigsaw-dev mailing list