在Java中,我们可以写
Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null); // private void say()
method.setAccessible(true);
method.invoke(f, null);
为什么Java反映API可以访问这样的方法?任何JVM的魔力?
这是一些“java安全属性”吗?
我尝试编写字节码dicty访问这样的方法/字段使用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周围调用它,但也失败了。
答案 0 :(得分:1)
JVM可以通过称为运行时类型信息(RTTI)的技术在运行时检查任何类。这是通过一种称为 Class 对象的特殊对象来完成的,该对象包含有关类。
类类和 java.lang.reflect 库支持Reflection的概念。因此,使用类 Class 的对象,jvm可以实例化,也可以调用类的方法/构造函数。
请检查类API:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
答案 1 :(得分:0)
拥有私有方法,以及可以通过某种方式访问但不能访问其他方式的字段,这是神奇的。能够访问所有内容是最简单的情况,默认情况下是本机级别。当你使用setAccessible(true)
时,它会关闭访问检查,这就是为什么你可以使用它,即使你知道你有访问权限,因为它可以加快调用()