为了能够更好地判断移植到Java 9时的反射风险我想知道shallow reflection代替静态编译是否安全,只要它引用了一个可访问的类型:
我的意思是,我可以随时替换
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?
这个问题的早期版本大约有specific code problem,我同时解决了这个问题。
但是一般性的问题也很有趣,可以讨论:是否存在返回的对象具有正确的子类型但在调用或MethodHandle解析时未通过访问检查的情况。