簡體   English   中英

使用反射獲取字段數據時出錯

[英]Getting Error While Using Reflection to get Field Data

我正在嘗試使用反射獲取字段名稱和字段值。

我正在根據需要的操作傳遞動態類。

我已經創建了一種獲取字段名稱和值的方法,我正在獲取字段名稱但沒有獲取字段值。 當我使用以下代碼時,它給了我一個錯誤java.lang.IllegalAccessException說明無法訪問類的私有成員。

以下是我的UPDATED代碼:

public String SerializeCommand(ICommand command){

    StringBuilder command_text = new StringBuilder();
    Field [] f = command.getClass().getDeclaredFields();
    for(Field field : f){
        field.setAccessible(true);
        command_text.append(field.getName() + ",");
        try {
            System.out.println(field.get(command.getClass()));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    return command_text.toString();
}

這里 ICommand 是它的類名,假設如果操作是添加那么添加類將被傳遞。

任何想法如何解決這個問題。

而不是 command.getClass() 傳遞命令類的對象。 該值包含按對象而不是按類

Java 還解決了無法訪問私有成員的問題,即使通過反射進行訪問也是如此。 但是構造函數、方法和字段是AccessibleObject ,它提供了一種方法來將成員標記為可訪問,盡管它可能是私有的:

field.setAccessible(true);

之后您可以閱讀它,甚至可以在其上設置一個新值。


進行編輯以使其清楚。 考慮以下簡單的記錄類:

public class Record {
    private int length;
    private String name;
    public Record(int length, String name) {
        this.length = length;
        this.name = name;
    }
    public int getLength() { return length; }
    public String getName() { return name; }
}

現在讓我們編寫一個反射測試程序:

public class ReflectionTest {
    public static void main(String[] args) throws Exception {
        Record record = new Record(42, "42");
        Field[] fields = record.getClass().getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName() + " => " + field.get(record));
        }
    }
}

這將導致IllegalAccessException ,因為無法訪問私有字段。 現在稍微改變一下 foreach 循環:

        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.getName() + " => " + field.get(record));
        }

這次你會看到預期的輸出:

長度 => 42

名稱 => 42

您的錯誤也是在類上而不是在對象上調用 get 方法。 這就像這個小小的修改:

        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.getName() + " => " + field.get(record.getClass()));
        }

這次您將看到IllegalArgumentException (不是IllegalAccessException )。

請試試這個代碼。

public String SerializeCommand(ICommand command){

    StringBuilder command_text = new StringBuilder();
    Field [] f = command.getClass().getDeclaredFields();
    try{
    for(Field field : f){
        field.setAccessible(true);
        command_text.append(field.getName() + ",");
        System.out.println("Value :: " + field.get(command));
    }
    }catch(IllegalArgumentException e){
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return command_text.toString();
}

暫無
暫無

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

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