クラスがあるとします:
public class R {
public static final int _1st = 0x334455;
}
リフレクションを介して「_1st」の値を取得するにはどうすればよいですか?
クラスがあるとします:
public class R {
public static final int _1st = 0x334455;
}
リフレクションを介して「_1st」の値を取得するにはどうすればよいですか?
最初にクラスのフィールド プロパティを取得すると、値を取得できます。タイプがわかっている場合は、get メソッドの 1 つを null で使用できます (静的フィールドの場合のみ。実際、静的フィールドの場合、get メソッドに渡された引数は完全に無視されます)。それ以外の場合は、getType を使用して、以下のように適切なスイッチを記述できます。
Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
System.out.println(f.getInt(null));
}else if(t == double.class){
System.out.println(f.getDouble(null));
}...
R.class.getField("_1st").get(null);
例外処理は、読者の課題として残しておきます。
基本的に、リフレクションを介して他のフィールドと同じようにフィールドを取得しますが、get メソッドを呼び出すと、操作するインスタンスがないため、null を渡します。
これは、最終的であるかどうかに関係なく、すべての静的フィールドで機能します。フィールドが公開されていない場合は、最初にそれを呼び出す必要がsetAccessible(true)
あり、もちろん SecurityManager はこれらすべてを許可する必要があります。
私は同じルートをたどっていました (生成された R クラスを調べて) が、これはおそらく Resources クラスの関数であると感じました。私が正しかった。
これを見つけました: Resources::getIdentifier
人々の時間を節約できるかもしれないと考えました。彼らはドキュメントでは落胆していると言っていますが、これはそれほど驚くべきことではありません.