私は、この構造を反映させて、変更できないクラスのセットにアクセスする以外に選択肢はありませんでした。 ただし、以下のmainメソッドに示されているメソッドを使用すると、NullPointerExceptionがスローされます。 f1.get(null)が呼び出されたときに、NULLポインタがコンストラクタの "table"になります。Javaクラスの静的変数に反射的にアクセスする
唯一のコンストラクタがプライベートであるため、クラスを事前にインスタンス化できません。だから明示的にテーブルを設定する方法はありません。
私がLegacy.Aと反射的に電話する方法を知っている人は誰ですか?
public class Legacy {
public static final Legacy A = new Legacy("A");
public static final Legacy B = new Legacy("B");
private String type0;
private static Map<String, Legacy> table = new HashMap<String, Legacy>();
private Legacy(String id) {
type0 = id;
table.put(type0, this);
}
public static void main(String[] args) throws Exception {
Field f1 = Legacy.class.getDeclaredField("A");
Object o = f1.get(null);
}
}
"Reflection == BAD !!!"
実際には、NPE、反射でもなくても、あなたがLegacy.Aにアクセスできる方法は見えません(この反射コードを 'Object o = Legacy.A'で置き換えてください)。あなたのコードを実行しようとしたとき、例外はクラスの初期化中に起こりました。 – kdgregory
これは、保存時に自動フォーマットされたコードを持つために得られるものです。 – Andrew