クラスがあり、そのすべてのパブリックフィールド(メソッドではない)を検索したい。これどうやってするの?
ありがとう!
回答:
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
パッケージ全体をご覧いただけます。
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.htmlには、メソッドとコンストラクターを見つけるためのチャートもあります。
必要に応じて、次の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());
数人のユーザーが述べたように、以下のコードは、特定のクラスのすべてのフィールドを見つけるのに役立ちます。
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());
}
}