question on exports to

Peter Levart peter.levart at gmail.com
Wed Jun 1 12:43:31 UTC 2016


Hi,


On 06/01/2016 12:03 PM, Alan Bateman wrote:
> On 01/06/2016 09:34, Jochen Theodorou wrote:
>> :
>>
>> This now looks to me like this... GeneralInvoker will have to call 
>> generalInvokerModule.addReads(myOtherLibModule), to enable to inspect 
>> the classes from that library. It will then spawn a layer with a 
>> named module, which contains the invocation code. This layerModule 
>> will contain code to call layerModule.addReads(myOtherLibModule), so 
>> it can access the classes in MyOtherLib if they are exported.... and 
>> since that is not yet the case, I will have to cause MyOtherLib to 
>> call myOtherLib.addExports("my.lib", layerModule).
>>
>> Which still means I cannot replace reflection completely, since it 
>> does not have to cause MyOtherLib to call 
>> myOtherLib.addExports("my.lib", layerModule). Or it means I still 
>> lack understanding - which would not surprise me at all.
> I don't wish to cause confusion in this thread but I think what you 
> are looking for is:
>
> 1. MyOtherLib declares`requires GeneralInvoker`.
>
> 2. GeneralInvoker resolves "MyOtherLib" to create a configuration, 
> that configuration is then instantiated as a module layer. There will 
> be at least one module in that layer, maybe others if there are other 
> dependences. GeneralInvoker will use findModule to locate the module 
> named "MyOtherLib".
>
> 3. GeneralInvoker will use Module.addExports to export com.foo.gi to 
> the runtime module MyOtherLib (from the thread then I gather than 
> com.foo.gi is not exported, at least not unconditionally). This will 
> allow the code in my.lib.SomeClassOfTheLibrary to invoke the public 
> invoke method in com.foo.gi.TheInvoker.
>
> 4. The static initializer in my.lib.SomeClassOfTheLibrary will export 
> my.lib to GeneralInvoker using Module.addExports. Again, I'm assuming 
> that my.lib is not exported unconditionally. This one might be strange 
> and non obvious but arises because qualified export aren't supported 
> across layers. The "no forward reference" rule should be clear, it 
> would be a security hazard. The "no back reference" (mean qualified 
> exports to modules in parent layers) is a discussion point. It's 
> useful in some scenario (like this one), not useful with static 
> references because it would not make sense. This is a topic in itself 
> and I don't wish to complicate your cage fight by going into this here.
>
> With #4 then it allows GeneralInvoker to invoke the public methods in 
> MyOtherLib's my.lib package.
>
> As Alex noted, we need to write-up some of these "dynamic module" 
> scenarios so there are pictures and examples to point at.
>
> -Alan.

I also don't wish to cause further confusion, but I have a feeling that 
Jochen might have the following situation:

- MyOtherLib contains classes and code that is using these classes 
(invoking their methods), but it wishes to call those methods via an 
indirection through a GeneralInvoker that happens to live in another module
- MyOtherLib is also using classes (invoking methods) from other modules 
that it already has direct access to, but it wishes to call those 
methods via an indirection through a GeneralInvoker too

If that is true, then perhaps there is a simpler solution that doesn't 
require modifying the exports of any module.

Make your TheInvoker take another argument of type MethodHandles.Lookup:

public class TheInvoker{
     public static Object invoke(MethodHandles.Lookup lookup, Object 
receiver, String name, Object... args) throws Throwable {
         Method m = receiver.getClass().getDeclaredMethod(name, 
toClass(args));
         MethodHandle mh = lookup.unreflect(m).bindTo(receiver);
         return mh.invokeWithArguments(args);
     }
...
}


Then pass the appropriate lookup to it from where you call 
TheInvoker.invoke (from MyOtherLib):

TheInvoker.invoke(MethodHandles.lookup(), receiver, "methodName", 
arguments...);


Would that work?

Regards, Peter



More information about the jigsaw-dev mailing list