簡體   English   中英

使用反射獲取內部類字段值

[英]Getting inner class field values using reflection

我試圖使用反射訪問內部類字段值。

假設這些類是:

public class OuterClass  {
    int a;
    public class InnerClass {
        int b;
        InnerClass(int b){
            this.b = b;
       }
    }

    public void setInnerField(int val){
        InnerClass a = new InnerClass(val);
    }
}

主要功能有:

OuterClass obj = new OuterClass();
obj.a = 10;
obj.setInnerField(5);

以下是我試圖獲取內部類字段值的內容,即b引用自我如何使用Java中的反射來訪問內部類變量值?

Class[] classes = obj.getClass().getDeclaredClasses();     
for(Class innerClass: classes){
    //System.out.println(innerClass.getName());
    Field[] fields = innerClass.getDeclaredFields();
    for(Field field : fields){
        //System.out.println(field.getName());
        System.out.println(field.get(obj));  //<-----IllegalArgumentException    
//Tried with below line too as suggested in above link                                                                     
System.out.println(field.get(innerClass.getInterfaces())); //<-----IllegalArgumentException
    }           
}

那么在運行時訪問內部類字段值的方法有哪些呢?

您的代碼引發IllegalArgumentException,因為:

`System.out.println(field.get(obj));
 System.out.println(field.get(innerClass.getInterfaces()));// your inner class does not implement any interfaces which result in [] as an arg`

您傳遞給get方法的obj arg必須與聲明您調用的get字段的類型相同,在此情況下為OuterClass $ InnerClass。 b

這已經記錄在get方法中:

如果指定的對象不是聲明基礎字段的類或接口的實例,則該方法將引發IllegalArgumentException。

您可以將您的內部類及其內部字段聲明為靜態,或者您可以將內部類的實例聲明為arg並將其作為arg傳遞給field.get( innerInstance ),當您在內部類字段上調用它時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM