2013-06-13 14 views
14

Mam klasę Java, która ma numer Fields.Pętla nad wszystkimi polami w klasie Java

Chciałbym przelać nad polami i zrobić coś dla tych, które są zerowe.

Na przykład, jeśli moja klasa jest:

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

w innym miejscu, to bym zrobić ClassWithStuff obiekt i chciałbym pójść chociaż wszystkie pola w klasie. Rodzaj podobny do tego:

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

Czy jest jakiś sposób, aby to osiągnąć?

+2

Użyj refleksji. –

+0

Lista obiektów? –

+0

To pachnie jak problem XY. Jaki jest twój początkowy cel? – fge

Odpowiedz

13

Zastosowanie getDeclaredFields na [klasa]

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

Ta kontrola zerowa nie wystarczy. Zobacz: http://stackoverflow.com/questions/7223482/java-how-can-i-z-reflection-check-if-a-field-is-initialized-lub-default-val – MickJ

+0

@MickJ If chce tylko sprawdzić, czy odwołania są zerowe, to powinno zrobić lewę (ponieważ prymitywne pola zostaną zwrócone jako nie-puste), ale jeśli on również chce sprawdzić, czy prymitywy są zainicjalizowane (np. liczby nie są 0), to to nie wystarczy –

+0

To było moje założenie oparte na polu int w jego klasie.Przez jego oświadczenie zerowe założyłem, że miał na myśli nie zainicjować. Ale masz rację. Mogę się mylić z moim założeniem. – MickJ

5

Tak, z refleksji.

Użyj obiektu Class, aby uzyskać dostęp do obiektów Field za pomocą metody getFields().

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

Następnie pętlę nad polami. Działa to, ponieważ wszystkie zadeklarowane pola to public. Jeśli nie są, należy użyć getDeclaredFields(), która uzyskuje dostęp do wszystkich Fields, które są bezpośrednio zadeklarowane w klasie, public lub nie.

+0

Ale 'ClassWithStuff' nie ma metody getFields(). – CodyBugstein

+0

'ClassWithStuff.class.getFields()' da ci publiczne zadeklarowane pola. 'ClassWithStuff.class.getDeclaredFields()' podaje wszystkie zadeklarowane pola. –

+1

Głupiutko, zapomniałem dodać literówkę z klasy. Zmodyfikowałem swoją odpowiedź, by powiedzieć "ClassWithStuff _.class_ .getFields()". – rgettman

1

To, czego szukasz, to reflection. Odbicie pozwala spojrzeć na swoją klasę lub inną klasę, aby zobaczyć, z czego jest wykonana. Java ma wbudowane odbicie, więc możesz z niego korzystać od razu. Następnie można robić takie rzeczy -

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

Można również użyć tej metody, aby uzyskać konstruktorów, itp, aby zrobić podobny i chłodnicy rzeczy.

Powiązane problemy