2013-06-13 5 views
14

Ich habe eine Java-Klasse, die eine Nummer Fields hat.Schleife über alle Felder in einer Java-Klasse

Ich möchte Schleife über alle Felder und tun etwas für die, die null sind.

Zum Beispiel, wenn meine Klasse ist:

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

In einem anderen Ort, würde ich ein ClassWithStuff Objekt machen, und ich würde allerdings die Felder alle in der Klasse gehen mag. Wie folgt:

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

Gibt es eine Möglichkeit für mich, dies zu erreichen?

+2

Verwenden Sie Reflexion. –

+0

Liste der Objekte? –

+0

Das riecht nach einem XY-Problem. Was ist dein ursprüngliches Ziel? – fge

Antwort

13

Verwenden getDeclaredFields auf [Klasse]

ClasWithStuff myStuff = new ClassWithStuff(); 
Field[] fields = myStuff.getClass().getDeclaredFields(); 
for(Field f : fields){ 
    Class t = f.getType(); 
    Object v = f.get(o); 
    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)

+0

Dieser Null-Check würde nicht ausreichen. Siehe: http://StackOverflow.com/Questions/7223482/java-how-can-i-with-reflection-check-if-a-field-is-initialized-oris-default-val – MickJ

+0

@MickJ If Er möchte nur prüfen, ob Referenzen Null sind, dann sollte dies den Trick machen (da primitive Felder als nicht-null zurückgegeben werden), aber wenn er auch überprüfen möchte, ob Primitive initialisiert sind (zB Zahlen sind nicht 0), dann dies wird nicht reichen –

+0

Das war meine Annahme basierend auf dem int-Feld in seiner Klasse.Mit seiner Nichtigkeitserklärung nahm ich an, er meinte nicht initialisiert. Aber Sie haben Recht. Ich könnte mich mit meiner Annahme irren. – MickJ

5

Ja, mit Reflexion.

Verwenden Sie das Objekt Class für den Zugriff auf Field Objekte mit der getFields() Methode.

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

Dann Schleife über die Felder. Dies funktioniert, weil alle von Ihnen angegebenen Felder public sind. Wenn dies nicht der Fall ist, verwenden Sie getDeclaredFields(), die auf alle Fields zugreift, die direkt für die Klasse public deklariert sind oder nicht.

+0

Aber 'ClassWithStuff' hat keine 'getFields()' Methode. – CodyBugstein

+0

'ClassWithStuff.class.getFields()' gibt Ihnen öffentlich deklarierte Felder. 'ClassWithStuff.class.getDeclaredFields()' gibt Ihnen alle deklarierten Felder. –

+1

Dumm ich, ich habe vergessen, das Klassenliteral hinzuzufügen. Ich habe meine Antwort geändert, um "ClassWithStuff _.class_ .getFields()" zu sagen. – rgettman

1

Was suchen ist heißt reflection. Mit Reflection können Sie Ihre eigene Klasse oder eine andere Klasse betrachten, um zu sehen, woraus sie besteht. Java verfügt über integrierte Reflektion, sodass Sie es sofort verwenden können. Dann können Sie tun Dinge wie -

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

Sie auch diese Methoden erhalten können, Konstrukteure, etc, ähnlich und kühlere Sachen zu tun.