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