It might be worth noting that invoking it using MethodHandles works:
MethodHandle mh = MethodHandles.lookup().findVirtual(Public.class, "m",
MethodType.methodType(void.class));
mh.invoke(p);

/Michael

On 28 November 2016 at 15:17, Jochen Theodorou <blackd...@gmx.org> wrote:

>
>
> On 28.11.2016 12:23, Peter Levart wrote:
> [...]
>
>> // Module m1:
>>
>> module m1 {
>>     exports pkg1;
>> }
>>
>> package internal;
>> public class InternalImpl {
>>     public void m() {
>>         System.out.println("m()");
>>     }
>> }
>>
>> package pkg1;
>> public class Public extends internal.InternalImpl {
>> }
>>
>
> is it legal for an exported class to "expose" an internal class in the
> class signature? I would have assumed this will fail compilation
>
>
>>
>> // Module m2:
>>
>> module m2 {
>>     requires m1;
>> }
>>
>> package pkg2;
>> import pkg1.Public;
>> import java.lang.reflect.Method;
>> public class Main {
>>     public static void main(String[] args) throws Exception
>>         Public p = new Public();
>>         // using bytecode
>>         p.m();
>>         // using reflection
>>         Method m = Public.class.getMethod("m");
>>         m.invoke(p);
>>         // IllegalAccessException: class pkg2.Main (in module m2) cannot
>> access class internal.InternalImpl (in module m1) because module m1 does
>> not export internal to module m2
>>     }
>> }
>>
>
> most likely p.m() will do invokevirtual P#m(), while
> Public.class.getMethod("m") will return a Method with the declaring class
> being internal.InternalImpl.
>
> bye Jochen
>

Reply via email to