![](/img/trans.png)
[英]Why am I getting a "Cannot set int field to hashmap" error while using get with java reflection?
[英]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.