2013-02-27 69 views
14

我有一個2 POJO類具有getter和setter方法,現在我試圖讓所有的類的類實例變量打印其價值。獲取類的實例變量和使用反射

我知道,我們可以使用反射怎麼辦呢?

這是我的POJO類這將延長我的反射類。

class Details{ 

private int age; 
private String name; 

} 

反思類是這樣的:

class Reflection{ 

public String toString(){ 

return all the fields of that class 
} 
+2

你看過*任何*反思教程或看過任何文檔? – 2013-02-27 12:53:36

+0

是的,我已經看到了這http://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-variable – Goofy 2013-02-27 12:54:01

+0

你可以參考我的POJO類 – Goofy 2013-02-27 12:55:16

回答

27

你可以做這樣的事情:

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()); 
    } 
} 

這將只打印了公共領域,打印私有字段使用類。遞歸的getDeclaredFields。

或者,如果你將擴展類:

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

好的,但我可以重寫toString方法並以同樣的方式做到這一點?這將返回所有的領域? – Goofy 2013-02-27 13:00:50

+0

當然,您必須將名稱/值附加到字符串中,而不是將其打印出來,並且還需要在Reflection類中引用Details類的實例。 – Emiel 2013-02-27 13:05:08

+0

我西港島線告訴你什麼,我想,如果我延長其在它的toString方法,並打印所有字段名的課上做......但概率是的toString是方法的BUIT,不能傳遞任何參數給 – Goofy 2013-02-27 13:09:12

1

分辨率代碼或上述有一個問題的答案。 訪問私有varible的價值他們的訪問類型必須設置爲true

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

否則它會拋出java.lang.IllegalAccessException。類反射無法訪問類的成員具有修飾符的細節「私有」

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

向上面的代碼添加一行。如果您要訪問類使用的私有財產低於線

field.setAccessible(真);