2017-02-20 93 views
2

我想了解反思如何與嵌套對象的領域:Java反射 - 訪問現場

這裏是ClassA的

public class ClassA { 

    Integer A; 
    Integer B; 
    List<ClassB> C; 

    public Integer getA() { 
     return A; 
    } 
    public void setA(Integer a) { 
     A = a; 
    } 
    public Integer getB() { 
     return B; 
    } 
    public void setB(Integer b) { 
     B = b; 
    } 
    public List<ClassB> getC() { 
     return C; 
    } 
    public void setC(List<ClassB> c) { 
     C = c; 
    } 


} 

ClassB的:

public class ClassB { 

    int a ; 
    int b; 

    public int getA() { 
     return a; 
    } 
    public void setA(int a) { 
     this.a = a; 
    } 
    public int getB() { 
     return b; 
    } 
    public void setB(int b) { 
     this.b = b; 
    } 


} 

,我試圖訪問這樣的字段:

public static void main(String[] args){ 
    ClassA classA=new ClassA(); 
     Field[] fields =classA.getClass().getDeclaredFields(); 
     for (Field field : fields) { 
      System.out.println(field.getName()); 
     } 
    } 

問題:我想訪問ClassB的領域,我試圖做這樣的事情:

fields[2].getType().getDeclaredFields(); 

但getType()返回接口java.util.List中這是事實,但我瞄準成員/ ClassB的

的領域然後我嘗試: fields[2].getGenericType()返回的java.util.List 並在調試模式下,我可以看到它返回ParameterizedTypeImpl,但我沒有申報,並獲取actualTypeArguments。

不知何故,當我聲明parameterizedTypeImpl時會出現編譯問題。

ParameterizedTypeImpl impl=fields[2].getGenericType(); 

ParameterizedTypeImpl不能解析爲一個類型

查看附加的圖片。 enter image description here

任何指針或幫助將不勝感激。

UPDATE:

我找到了解決辦法:

for (Field field : fields) { 
      if(field.getType().getTypeName().equalsIgnoreCase("java.util.List")){ 
        ParameterizedType impl=(ParameterizedType) field .getGenericType(); 
        String nameOfClass=impl.getActualTypeArguments()[0].getTypeName(); 
      } 

感謝您的幫助球員。

+0

只是快速回顧一下,您正在訪問'List',您仍然需要迭代它以獲取'ClassB'的實例。 – AxelH

+0

@AxelH是的,這對我來說很清楚。謝謝指出。 – Roxy

+1

請不要說「不知何故,它會產生編譯問題」。如果它在編譯時給你一個錯誤,請顯示你嘗試的代碼並告訴我們錯誤是什麼。不要隱藏我們的重要信息。 – ajb

回答

2
ClassA classA=new ClassA(); 
     Field[] fields =classA.getClass().getDeclaredFields(); 
     for (Field field : fields) { 
      if (Collection.class.isAssignableFrom(field.getType())){ 
       System.out.println(field.getName());//you can remove this as per requirement 
       Class<?> c1 = (Class<?>) ((((ParameterizedType) field.getGenericType()).getActualTypeArguments())[0]); 

       Field[] fieldsInner = c1.getDeclaredFields(); 
       for (Field fieldInner : fieldsInner) { 
        System.out.println(fieldInner.getName()); 

      } 
      else{ 
      System.out.println(field.getName());} 

     }