5

この質問と同様に、POJO の 1 つのインスタンスのすべてのプライベート フィールドにアクセスする必要があります。違いは、事前に必要なフィールドの特定の名前がわからないことです。

たとえば、POJO が次の場合:

public class Widget {
    private java.lang.String fizz;
    private java.lang.Boolean buzz;
    private com.me.myapp.Foo foo;
}

Widgetインスタンス (またはクラス自体) を検査し、それらの名前/型を事前に知らなくても、それらの 3 つのフィールド/型があることを確認する方法を探しています。

これは可能ですか?もしそうなら、どのように?そうでない場合、なぜですか?

更新

System.out.println("classToInspect = " + classToInspect.getName() + ", and fields are:\n");
for(Field f : allFields)
    System.out.println(f.getType());

版画:

classToInspect = com.myorg.myapp.LoggerConfig, and fields are:

int
int
int
class java.lang.reflect.Constructor
class java.lang.Class
class java.lang.String
class java.security.ProtectionDomain
boolean
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
int
int
class sun.reflect.generics.repository.ClassRepository
long
class [Ljava.io.ObjectStreamField;
class sun.reflect.ReflectionFactory
boolean
class [Ljava.lang.Object;
interface java.util.Map
class [Ljava.lang.annotation.Annotation;
interface java.util.Map
interface java.util.Map
class sun.reflect.annotation.AnnotationType

注意: これらのフィールドはどれも、実際のLoggerConfigクラスのフィールド/プロパティ/メンバーではありません。Objectリフレクションまたはスーパークラスの一部を介して提供/追加する必要があります...

4

4 に答える 4

7

getDeclaredFieldsクラスのメソッドを使用してClass、その修飾子に関係なく、クラスで宣言されているすべてのフィールドを取得できます。メソッドを使用getDeclaredFieldsすると、 の配列が提供さFieldれます。これを反復処理し、メソッドを呼び出してgetTypeフィールドの型を取得できます。次のコードは同じことを示しています。

class TestClass
{
    private String x;
    private int y;
    private boolean z;
}
public class Test
{
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException 
    {
        Class clazz = TestClass.class;
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) 
        {
            System.out.println("fieldName: "+field.getName()+", fieldType: "+field.getType());
        }
    }
}

上記のコードは次を出力します。

fieldName: x, fieldType: class java.lang.String
fieldName: y, fieldType: int
fieldName: z, fieldType: boolean
于 2013-07-03T17:54:27.760 に答える
5

以下を使用して、すべてのプライベート フィールドを一覧表示します

  List<Field> privateFields = new ArrayList<>();
    Field[] allFields = SomeClass.class.getDeclaredFields();
    for (Field field : allFields) {
        if (Modifier.isPrivate(field.getModifiers())) {
            privateFields.add(field);
            System.out.format("type is", field.getType());
        }
    }
于 2013-07-03T15:05:50.000 に答える