1. ホーム
  2. java

[解決済み] Java Reflectionです。変数の名前を取得する方法は?

2022-04-28 22:23:36

質問

Java Reflectionを使用して、ローカル変数の名前を取得することは可能でしょうか? 例えば、こんなのがあったら。

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(***); 
    }
}

EDIT: この質問は、次のものとは異なります。 Javaで、関数に渡された変数の名前を見つける方法はありますか? 他の質問(受け入れられた答えを含む)が変数の値をテストすることにもっと焦点を当てているのに対し、より純粋に、ローカル変数の名前を決定するためにリフレクションを使うことができるかどうかについて質問しているという点で、です。

どのように解決するのですか?

Java 8では、ローカル変数の名前情報の一部がリフレクションで利用できるようになりました。詳細は "アップデート" の項を参照してください。

完全な情報はクラスファイルに格納されることが多い。コンパイル時の最適化の1つは、これを削除してスペースを節約することです(そして、いくらかの難読化も提供します)。しかし、それが存在する場合、各メソッドは局所変数テーブル属性を持ち、局所変数の型と名前、およびそれらがスコープ内にある命令の範囲をリストアップします。

のようなバイトコードエンジニアリングライブラリは、おそらく ASM を使えば、この情報を実行時に検査することができます。この情報を必要とする妥当な場所は、開発ツールの中だけだと思うので、バイトコードエンジニアリングは他の目的でも役に立つと思われます。


アップデートする 限定対応となりました がJava 8に追加されました。 パラメータ(ローカル変数の特殊なクラス)名がリフレクションで利用できるようになりました。他の目的の中で、これは @ParameterName アノテーションを使用します。