Java反射 'Can not set'错误

标签 java reflection

我正在尝试使用 Java 反射获取通用 Field 属性的实例,以便执行此 Field 的方法。

例如,如果我有一个带有 getValue() 方法的类型 MyType 类,并且我有另一个带有 MyType 类属性的 MyContainer 类,我正在寻找的是动态获取此字段并执行 getValue() 方法.这可能吗?

使用以下代码结构,我得到:

Exception in thread "main" java.lang.IllegalArgumentException: Can not set test.MyType field test.MyContainer.field1 to test.MyType
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:393)
    at test.Main.main(Main.java:24)

我的容器

public class MyContainer {

MyType field1;
MyType field2;

public MyContainer() {
    super();
}

public MyContainer(MyType field1, MyType field2) {
    super();
    this.field1 = field1;
    this.field2 = field2;
}

public MyType getField1() {
    return field1;
}

public MyType getField2() {
    return field2;
}
}

我的类型

public class MyType {

private MyEnum var1;
private String var2;

public MyType() {
    super();
}

public MyType(MyEnum var1, String var2) {
    this.var1 = var1;
    this.var2 = var2;
}

public MyEnum getVar1() {
    return var1;
}

public String getVar2() {
    return var2;
}   
}

我的枚举

public enum MyEnum {

A(""),

N("0");

private final String value;

private MyEnum(String value) {
    this.value = value;
}

@Override
public String toString() {
    return this.value;
}
}

执行

    java.lang.reflect.Field[] allFields = MyContainer.class.getDeclaredFields();        
    MyType obj = new MyType();

    for (java.lang.reflect.Field field : allFields) {

        if ( MyType.class == field.getType() ){                 

            field.setAccessible(true);              
            MyType myAux = (MyType) field.get(obj);             
            String dowhatever = myAux.getVar2();    

        }
    }

正如您在异常中看到的,test.MyType 字段类型似乎完全等同于转换中提供的 test.MyType。我做错了什么?

最佳答案

obj 应该属于 MyContainer 类,而不是 MyType

java.lang.reflect.Field[] allFields = MyContainer.class.getDeclaredFields();        
MyContainer obj = new MyContainer();

for (java.lang.reflect.Field field : allFields) {

    if ( MyType.class == field.getType() ){                 

        field.setAccessible(true);              
        MyType myAux = (MyType) field.get(obj);             
        String dowhatever = myAux.getVar2();    

    }
}

参见 here

get(Object obj)

返回指定对象上此字段表示的字段的值。

关于Java反射 'Can not set'错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38219697/

相关文章:

java - Android:将项目添加到自定义 ListView

java - 为什么抽象实现由 Map.values() 返回?

c# - 在 .net 中隐藏私有(private)字段以防止反射

java - 帮助反射+构造函数

java - 我们可以使用java反射获取作者姓名、方法目的吗

java - Java 中方法调用什么时候可以更改参数,什么时候不可以更改参数?

java - 我的 jar 可以在 Ubuntu 上运行,但不能在 Windows 上运行

java - 如何检查一种模式是否包含在另一种模式中

java - 如何使用反射来构建通用子类型?

C#:如何实例化私有(private)内部类列表?