1

Javaでは、次のように書くことができます

Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null); // private void say() 
method.setAccessible(true);
method.invoke(f, null);

Java Reflect 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 は、Run Time Type Information (RTTI) と呼ばれる手法を使用して、実行時に任意のクラスを検査できます。これは、クラスに関する情報を含むClassオブジェクトと呼ばれる特別な種類のオブジェクトを使用して実行されます。

クラスクラスjava.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 に答える