Java リフレクションを使用して、ローカル変数の名前を取得することは可能ですか? たとえば、次のような場合です。
Foo b = new Foo();
Foo a = new Foo();
Foo r = new Foo();
次のように、これらの変数の名前を見つけることができるメソッドを実装することは可能ですか?
public void baz(Foo... foos)
{
for (Foo foo: foos) {
// Print the name of each foo - b, a, and r
System.out.println(***);
}
}
編集:この質問はJava で関数に渡された変数の名前を見つける方法はありますか?この質問は、リフレクションを使用してローカル変数の名前を決定できるかどうかをより純粋に尋ねているのに対し、他の質問 (受け入れられた回答を含む) は、変数の値のテストに重点を置いています。
ベストアンサー1
Java 8では、リフレクションを通じていくつかのローカル変数名情報が利用可能になりました。"アップデート"以下のセクションを参照してください。
完全な情報は、多くの場合、クラス ファイルに保存されます。コンパイル時の最適化の 1 つは、これを削除してスペースを節約することです (また、ある程度の難読化も実現します)。ただし、これが存在する場合、各メソッドには、ローカル変数の型と名前、およびスコープ内の命令の範囲をリストするローカル変数テーブル属性があります。
おそらく、次のようなバイトコードエンジニアリングライブラリオーストラリア実行時にこの情報を検査できるようになります。この情報が必要になる唯一の合理的な場所は開発ツール内であると考えられるため、バイトコード エンジニアリングは他の目的にも役立つ可能性があります。
アップデート:これに対する限定的なサポートはJava 8 に追加されました。@ParameterName
パラメータ (ローカル変数の特別なクラス) の名前がリフレクション経由で利用できるようになりました。これは、他の目的の中でも、依存性注入コンテナで使用される注釈を置き換えるのに役立ちます。