2012-12-09 57 views
1

在Java中,我们可以写为什么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调用它,但也失败了。

+0

* JVM的任何魔力?*是的。反射API不可能在“纯”的Java代码中实现。 (您需要来自JVM的支持。) – aioobe

回答

1

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

该类java.lang.reflect库支持Reflection的概念。因此,使用类的对象,JVM可以实例,也可以调用类的方法/构造函数。

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

0

拥有私有方法,并且可以访问某些方面而不是其他领域,是神奇的。能够访问一切都是最简单的情况,并在母语水平的默认。当你使用setAccessible(true)它只是关闭访问检查,这就是为什么你可以使用它,即使你知道你有访问,因为它可以加快调用()

相关问题