30

多数のFields.

すべてのフィールドをループして、null のフィールドに対して何かをしたいと思います。

たとえば、私のクラスが次の場合:

public class ClassWithStuff {
    public int inty;
    public stringy;         
    public Stuff;
    //many more fields
}

別の場所でClassWithStuffオブジェクトを作成し、クラス内のすべてのフィールドを調べたいと思います。このような種類:

for (int i = 0; i < ClassWithStuff.getFields().size(); i++) {
      //do stuff with each one
}

これを達成する方法はありますか?

4

4 に答える 4

33

getDeclaredFields[クラス]で使用

ClasWithStuff myStuff = new ClassWithStuff();
Field[] fields = myStuff.getClass().getDeclaredFields();
for(Field f : fields){
   Class t = f.getType();
   Object v = f.get(myStuff);
   if(t == boolean.class && Boolean.FALSE.equals(v)) 
     // found default value
   else if(t.isPrimitive() && ((Number) v).doubleValue() == 0)
     // found default value
   else if(!t.isPrimitive() && v == null)
     // found default value
}

( http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html )

于 2013-06-13T19:42:52.820 に答える
9

はい、反省しながら。

オブジェクトを使用して、メソッドでClassオブジェクトにアクセスします。FieldgetFields()

Field[] fields = ClassWithStuff.class.getFields();

次に、フィールドをループします。これは、宣言したすべてのフィールドがpublic. そうでない場合は、クラスで直接宣言されているgetDeclaredFields()すべてのものにアクセスするか、そうでないものを使用します。Fieldspublic

于 2013-06-13T19:43:47.010 に答える
3

探しているものはリフレクションと呼ばれます。リフレクションを使用すると、自分のクラスや別のクラスを調べて、それが何で構成されているかを確認できます。Java にはリフレクションが組み込まれているので、すぐに使用できます。次に、次のようなことができます-

for(Field f : ClasWithStuff.getFields()){
    System.out.println(f.getName());//or do other stuff with it
}

これを使用して、メソッド、コンストラクターなどを取得し、同様のよりクールなことを行うこともできます。

于 2013-06-13T19:46:38.707 に答える