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