为了能够更好地判断移植到Java 9时的反射风险,我想知道只要引用可访问类型,浅层反射代替静态编译是否安全:
我的意思是,我可以随时更换
PublicType p = (PublicType)(Factory.instance());
p.publicMethod();
Run Code Online (Sandbox Code Playgroud)
(Factory.instance()
返回类型在哪里Object
,将Package.PublicType
从未打开的模块返回API类型()的子类型.
同
Object p = Factory.instance();
Class<?> c = Class.forName("package.PublicType");
Method m = c.getMethod("publicMethod", (Class[])null);
// assert p instanceof package.PublicType
m.invoke(p, (Object[])null); // throws?
Run Code Online (Sandbox Code Playgroud)
这个问题的早期版本关于我同时解决的特定代码问题.
但是一般的问题也很有意思:在返回的对象具有正确的子类型但是在调用或MethodHandle解析时无法进行访问检查.