リフレクションを介してJavaのクラスのpublic static finalフィールド/プロパティの値を取得する


103

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

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

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


R._1st働けなかった?Android開発について話している場合、Rクラスは常にそこにあると思います...
Matthieu

@Matthieu私もそう考えました。この日まで私はこれとまったく同じことをしなければなりませんでしたが、BRクラスでのみでした。
Sevastyan Savanyuk 2017年

回答:


132

最初にクラスのフィールドプロパティを取得し、次に値を取得できます。タイプがわかっている場合は、nullを指定したgetメソッドの1つを使用できます(静的フィールドの場合のみ、実際には静的フィールドでは、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));
}...

ありがとう。試しましたがうまくいきませんでした。操作f.getInt(null)で例外がスローされます。私はそれをキャッチしましたが、なぜ例外があるのですか?
Viet

1
どのような例外を受けましたか?
M.ジェサップ2010

こんにちは、例外e.getMessage()はフィールド名を返します。これは「_1st」で他には何もありません。
Viet

1
しかし、例外の種類は何ですか?(つまり、NullPointerException、SecurityException、...)
M. Jessup 2010

2
getInt()渡された引数を無視することがドキュメントに記載されていないのはなぜですか?クラスのインスタンスをそこに渡そうとすることに費やした時間。
Sevastyan Savanyuk 2017年

70
 R.class.getField("_1st").get(null);

例外処理は読者のための演習として残されています。

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

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


わかった。私が必要としたクラスは、実際にはR.idでした。ご協力いただきありがとうございます!
Viet

1

私は同じルートをたどっていて(生成されたRクラスを調べて)、恐らくResourcesクラスの関数であるという恐ろしい気持ちになりました。私が正しかった。

これが見つかりました: リソース:: getIdentifier

人々の時間を節約するかもしれないと思った。彼らはそれがドキュメントで落胆すると言いますが、それはそれほど驚くべきことではありません。


Androidの質問だと推測しました。タグで示されている必要があります...
Matthieu 2015

これはAndroidの質問ではなく、特定の例を使用したJavaリフレクションの質問です。質問はトピックに基づいてタグ付けされます。
Matthew Read
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.