クラスがあるとしましょう:
public class R {
public static final int _1st = 0x334455;
}
リフレクションを介して"_ 1st"の値を取得するにはどうすればよいですか?
最初にクラスのフィールドプロパティを取得してから、値を取得できます。タイプがわかっている場合は、nullを使用してgetメソッドのいずれかを使用できます(静的フィールドのみ、実際には静的フィールドでは、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 :: getIdentifier
時間を節約できると思った。ドキュメントでは落胆していると言われていますが、それは驚くことではありません。