2013-02-27 11 views
14

Mam 2 klasy POJO z obiektami pobierającymi i ustawiającymi, teraz próbuję uzyskać wszystkie zmienne instancji klasy tej klasy.Pobierz zmienne instancji klasy i wydrukuj ich wartości za pomocą refleksji

Dowiedziałem się, że możemy użyć refleksji, jak to zrobić?

To jest moja klasa POJO, która rozszerzy moją klasę odbicia.

class Details{ 

private int age; 
private String name; 

} 

klasa Odbicie jest tak:

class Reflection{ 

public String toString(){ 

return all the fields of that class 
} 
+2

Czy obejrzałeś * dowolne * samouczki dotyczące refleksji lub obejrzałeś dowolne dokumenty? –

+0

Tak, widziałem to http://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-wancess – Goofy

+0

możesz odwołać się do mojej klasy pojo – Goofy

Odpowiedz

27

Można zrobić coś takiego:

public void printFields(Object obj) throws Exception { 
    Class<?> objClass = obj.getClass(); 

    Field[] fields = objClass.getFields(); 
    for(Field field : fields) { 
     String name = field.getName(); 
     Object value = field.get(obj); 

     System.out.println(name + ": " + value.toString()); 
    } 
} 

Byłoby to wydrukować tylko pól publicznych, aby wydrukować pola prywatne użyć klasy. getDeclaredFields rekurencyjnie.

Albo gdyby rozszerzyć klasę:

public String toString() { 
    try { 
     StringBuffer sb = new StringBuffer(); 
     Class<?> objClass = this.getClass(); 

     Field[] fields = objClass.getFields(); 
     for(Field field : fields) { 
      String name = field.getName(); 
      Object value = field.get(this); 

      sb.append(name + ": " + value.toString() + "\n"); 
     } 

     return sb.toString(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

ok, ale czy mogę przesłonić metodę toString i zrobić to w ten sam sposób? który zwróci mi wszystkie pola? – Goofy

+0

Oczywiście, musisz dodać nazwę/wartość do łańcucha zamiast go wypisać, a także potrzebujesz odwołania do instancji klasy Szczegóły w klasie Reflection. – Emiel

+0

Powiem ci, co próbuję zrobić, jeśli rozszerzę klasę, która ma w sobie metodę toString i wypisze wszystkie nazwy pól ... ale prob jest toString jest buit w metodzie i nie może przekazać żadnych parametrów do tego – Goofy

1

Kod rozdzielczości lub odpowiedź których wspomniano powyżej ma jeden problem. Aby uzyskać dostęp do wartości prywatnej varible ich rodzaj dostępu musi być ustawiony na prawdziwej

Field[] fields = objClass.getDeclaredFields(); 
for (Field field : fields) { 
    NotNull notNull = field.getAnnotation(NotNull.class); 
    field.setAccessible(true); 
} 

jeszcze będzie rzucać java.lang.IllegalAccessException. Klasa Odbicie nie może uzyskać dostępu do elementu Szczegóły klasy z modyfikatorami "prywatny"

1
ClassLoader classLoader = Main.class.getClassLoader(); 
    try { 
     Class cls = classLoader.loadClass("com.example.Example"); 
     Object clsObject = cls.newInstance(); 

     Field[] fields = cls.getFields(); 
     for (Field field : fields) { 
      String name = field.getName(); 
      Object value = field.get(clsObject); 

      System.out.println("Name : "+name+" Value : "+value); 

     } 
     System.out.println(cls.getName()); 


    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
0

Dodanie jeszcze jednego wiersza do powyższego kodu. Jeśli chcesz uzyskać dostęp do prywatnych właściwości klasy, użyj poniższej linii:

field.setAccessible (true);

Powiązane problemy