2012-12-09 100 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)它只是關閉訪問檢查,這就是爲什麼你可以使用它,即使你知道你有訪問,因爲它可以加快調用()

相關問題