web-dev-qa-db-ja.com

Javaリフレクション経由でクラスのパブリック静的最終フィールド/プロパティの値を取得

クラスがあるとしましょう:

public class R {
    public static final int _1st = 0x334455;
}

リフレクションを介して"_ 1st"の値を取得するにはどうすればよいですか?

84
Viet

最初にクラスのフィールドプロパティを取得してから、値を取得できます。タイプがわかっている場合は、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));
}...
114
M. Jessup
_ R.class.getField("_1st").get(null);
_

例外処理は、読者の課題として残されています。

基本的に、リフレクションを介して他のフィールドと同様にフィールドを取得しますが、アクションを実行するインスタンスがないため、getメソッドを呼び出すとnullを渡します。

これは、最終フィールドであるかどうかに関係なく、すべての静的フィールドで機能します。フィールドがパブリックではない場合、最初にそのフィールドでsetAccessible(true)を呼び出す必要があり、もちろんSecurityManagerはこれをすべて許可する必要があります。

59
Yishai

私は同じルート(生成されたRクラスを見て)をたどっていましたが、おそらくリソースクラスの関数だと恐ろしく感じました。私は正しかったです。

これを見つけました: Resources :: getIdentifier

時間を節約できると思った。ドキュメントでは落胆していると言われていますが、それは驚くことではありません。

1
Brian