在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調用它,但也失敗了。
* JVM的任何魔力?*是的。反射API不可能在「純」的Java代碼中實現。 (您需要來自JVM的支持。) – aioobe