在Java中,我们可以这样写
Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null); // private void say()
method.setAccessible(true);
method.invoke(f, null);
为什么Java Reflect API可以访问这样的方法? JVM 有什么魔力吗?
这是一些“java安全属性”吗?
我尝试使用 asm.jar 编写对此类方法/字段的字节码字典访问,但失败了。它总是抛出:
Exception in thread "main" java.lang.IllegalAccessError: tried to access field org.nutz.Abc.name from class sun.net.wendal.V$1
at sun.net.wendal.V$1.run(V.java:14)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.wendal.V.main(V.java:11)
我尝试围绕 AccessController.doPrivileged 调用它,但也失败了。
最佳答案
JVM 可以通过称为运行时类型信息 (RTTI) 的技术在运行时检查任何类。这是通过一种称为 Class 对象的特殊对象来完成的,其中包含有关该类的信息。
类Class和java.lang.reflect库支持反射的概念。所以使用类Class的对象,jvm可以实例化,也可以调用该类的方法/构造函数。
请检查类API:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
关于java - 为什么Java Reflect可以访问私有(private)字段/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787440/