1

在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安全属性”吗?

我尝试使用 asm.jar 编写对此类方法/字段的字节码 dicty 访问,但失败了。它总是抛出:

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 调用它,但也失败了。

4

2 回答 2

1

JVM 可以通过一种称为运行时类型信息 (RTTI) 的技术在运行时检查任何类。这是通过一种称为对象的特殊对象来完成的,该对象包含有关类的信息。

Classjava.lang.reflect库支持反射的概念。因此使用类Class的对象,jvm 可以实例化并且还可以调用该类的方法/构造函数。

请检查类 API:http ://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

于 2012-12-09T13:40:02.200 回答
0

拥有私有方法和可以通过某些方式访问但不能通过其他方式访问的字段是很神奇的。能够访问所有内容是最简单的情况,也是本机级别的默认设置。当您使用setAccessible(true)它时,只需关闭访问检查,这就是为什么即使您知道您可以访问它也可以使用它,因为它可以加快调用()

于 2012-12-09T15:32:29.247 回答