2016-04-02 28 views
1

私はjava.reflectionで解析したいクラスがあります。 私は他のオブジェクトのArraylistを持つクラスを作成しました。 ArrayListを持つクラスを解析したいとき、クラスは再帰されますが、Arraylistのサイズを取得する方法はわかりません。反射を使ってオブジェクトからarraylistサイズを取得する

コードを添付しました。

public class Department { private ArrayList Students;

public Department() { 
    super(); 
    Students = new ArrayList<>(); 
} 
public Department(ArrayList<Student> students) { 
    super(); 
    Students = students; 
} 
public void addStudent(Student student){ 
    if(student != null){ 
     this.Students.add(student); 
    } 

} 
@Override 
public String toString() { 
    return "Class [Students=" + Students + "]"; 
} 


public static void analyze2(Object obj){ 
    Class c = obj.getClass(); 
    Field[] fieldType= c.getDeclaredFields(); 
    ArrayList<?> ob = new ArrayList<>(); 
    System.out.println(obj.toString()); 

     for(Field field : fieldType){ 
      Class cd = field.getType(); 
      ob = (ArrayList<?>) cd.cast(ob); 
      System.out.println(field.getName()+" "+ field.getType()); 
      System.out.println(ob.size()); 

     } 
    } 

答えて

0

あなたはgetメソッドを使用してフィールド値を取得し、Departmentオブジェクトのインスタンスを渡す必要があります。フィールドのタイプがArrayListの場合、結果を 'ArrayList'にキャストし、そのサイズを出力します。あなただけ戻っArrayListにオブジェクトをキャストすることなく、&が反射によってsizeメソッドを呼び出す取得したい場合は

for(Field field : fieldType){ 
     Class<?> cd = field.getType(); 
     Object fieldVal = field.get(ob); 
     if(fieldVal instanceof ArrayList){ 
     ArrayList<?> arrayListField = (ArrayList<?>)fieldVal; 
     System.out.println(arrayListField.size()); 
     } 
     System.out.println(field.getName()+" "+ field.getType()); 
    } 
+0

ありがとうございました!できます –

1

は、使用することができますMethod.invoke():私はする必要が例外のノートを作っ

ArrayList<String> list = new ArrayList<>(); 
    list.add("A"); 
    list.add("B"); 

    Object obj = list; 
    Class noparams[] = {}; 
    Class cls = obj.getClass(); 

    // note may throw: NoSuchMethodException, SecurityException 
    Method method = cls.getDeclaredMethod("size", noparams); 
    method.setAccessible(true); 

    // note may throw: IllegalAccessException, IllegalArgumentException, InvocationTargetException 
    Object retObj = method.invoke(obj, (Object[]) null); 

    System.out.println(retObj); 

処理されますが、例外処理の詳細は除外されています。&は、状況に応じて異なります。状況に応じて最適な処理を行います。

公式チュートリアル:method invocation via reflection

関連する問題