2017-02-20 6 views
2

私は反射がネストされたオブジェクトでどのように動作するかを理解しようとしています:Javaのリフレクション - フィールドのアクセスフィールド

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


} 

と私がしようとしています:ここ

はに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 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はタイプ

に解決することはできません

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

は添付画像を参照してください。 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());} 

     } 
関連する問題