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