Java:クラス内のすべての変数名を取得する


91

クラスがあり、そのすべてのパブリックフィールド(メソッドではない)を検索したい。これどうやってするの?

ありがとう!


リフレクションAPIを使用してこれを行うことができるはずです。
Crozin

回答:


134
Field[] fields = YourClassName.class.getFields();

クラスのすべてのパブリック変数の配列を返します。

getFields()クラス階層全体のフィールドを返します。問題のクラスでのみ定義され、スーパークラスではないフィールドが必要な場合は、を使用し、次の方法でフィールドgetDeclaredFields()をフィルタリングしpublicますModifier

Modifier.isPublic(field.getModifiers());

YourClassName.classリテラルは、実際の型のオブジェクトを表しますjava.lang.Class。より興味深い反射方法については、ドキュメントを確認してください。

上記のFieldクラスはjava.lang.reflect.Fieldです。java.lang.reflectパッケージ全体をご覧いただけます。


2
ただのメモ-最初は私の答えには間違った声明が含まれていましたが、何度も賛成されました。詳しくお読みください;)
Bozho 2010年

1
@downvoter-間違いは前にありました。今見たら共有してください。
Bozho 2010年

このソリューションは遅いですか?またはそれを自由に使用できますか?
Dany Y

大丈夫です。しかし、それを使いすぎないでください。
Bozho


15

必要に応じて、次の2つのいずれかを使用できます。

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

上記のリストのパブリックフィールドのみを(要件に基づいて)フィルタリングするには、以下のコードを使用します。

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());

2

数人のユーザーが述べたように、以下のコードは、特定のクラスのすべてのフィールドを見つけるのに役立ちます。

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

ただし、より興味深いアプローチを以下に示します。

ジャクソンライブラリの助けを借りて、タイプString / integer / doubleのすべてのクラスプロパティと、Mapクラスのそれぞれの値を見つけることができました。(リフレクションAPIを使用せずに!

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.