为了能够在移植到 Java 9 时更好地判断反射的风险,我想知道浅反射代替静态编译是否安全,只要它引用可访问的类型:
我的意思是,我可以随时更换吗
PublicType p = (PublicType)(Factory.instance());
p.publicMethod();
(其中Factory.instance()
有返回类型,并且会从未打开的模块Object
返回 API 类型 ( ) 的子类型)。Package.PublicType
和
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?
这个问题的早期版本是关于我同时解决的特定代码问题。
但一般性问题也很有趣:是否存在返回对象的子类型正确但在调用或 MethodHandle 解析时访问检查失败的情况。