2
public class MyClass {
    private String s = "foo";
}

"foo"new をインスタンス化せずにリフレクションを使用することは可能MyClassですか?

Field field = MyClass.class.getDeclaredField("s");
// -- ideally: --
// Object initializationValue = field.getInitializationValue();
// assert initializationValue.equals("foo");
4

3 に答える 3

5

あなたが示したような初期化ステートメントは、実際にはコンパイラによってクラスのコンストラクタに移動されます。クラスを実行するには、実際にクラスをインスタンス化する必要があります。もちろん、これはすべて舞台裏です。しかし、あなたの質問への答えとしては、いいえ、それはできません。

ただし、これらのフィールド値は、Soot などの静的分析ツールを使用して決定できる可能性があります。

于 2013-02-08T13:31:41.423 に答える
1

「ごまかし」なくしてはありえない。

チートの 1 つは、新しいインスタンスを作成するクラスを作成 (または生成) し、MyClassリフレクションを使用して必要な値を掘り出して stdout に書き込むことです。次に、子 JVM を起動してそのクラスを実行し、現在のオンで読み取ります。

MyClass 最終結果 -現在の JVM でインスタンス化せずに値を取得しました。

別のチートは、バイトコード ライブラリを使用してMyClass「.class」ファイルからバイトコードを読み取り、現在の JVM のコンテキストで初期化子の実行をシミュレートすることです。MyClass

于 2013-02-08T14:03:40.473 に答える