我需要调用一些半可靠的Java代码,并希望禁用在代码执行期间使用反射的功能.
try{
// disable reflection somehow
someObject.method();
}
finally{
// enable reflection again
}
Run Code Online (Sandbox Code Playgroud)
可以使用SecurityManager来完成,如果是这样,怎么做?
澄清/上下文:这是关于限制可以从JavaScript/Rhino调用的包的另一个问题的后续行动.接受的答案引用了关于如何做到这一点的博客条目,它需要两个步骤,第一个使用Rhino API(ClassShutter),第二个使用关闭反射和Class.forName().我想我可以使用SecurityManager更干净地完成第二步(了解SecurityManager,正如已经指出的那样,沿途是一个复杂的野兽).
总而言之,我希望(从代码,而不是设置文件)关闭Class.forName()以及对整个反射包的任何访问.
使用反射时需要注意哪些潜在问题.我在反思中非常困惑,为什么java提供这种类型的功能来访问私有数据成员.
私有: 就像我想的那样,只有声明它的类才能看到它.
那为什么有可能访问其他类的私人事物?这个术语(反射)完全溢出了我在java中的private(Access Specifier)属性的概念.
我访问了许多有关此主题的链接,但没有给出关于此主题的完整说明.例如:
package example;
import java.lang.reflect.Method;
class A{
private void privateMethod(){
System.out.println("hello privateMethod()");
}
}
class B{
public static void main(String[] args) throws Exception {
A d = new A();
Method m = A.class.getDeclaredMethod("privateMethod");
m.setAccessible(true);
m.invoke(d);
}
}
Run Code Online (Sandbox Code Playgroud)
请详细解释这种方法的情景?我需要其他类中私有方法可访问性的优点和缺点吗?