java - 如何获取该类中某个字段的字段值

标签 java reflection field

我想通过以下方式迭代类字段

我有课

public class Parent{

String name;
String lastName;

}

public class Child extends Parent{

int childNumber;
}

在父类中我想要一个“get”方法

child 将继承

此方法将按字段名称返回字段的值

如何检索字段的值?

我想要的方法是这样的:

public Object get(String key){
            Field field;
        Object result = null;
        try {
            field = this.getClass().getDeclaredField(key);
            if(field!=null) {
                field.setAccessible(true);
            }
            result = field.get(this); // this is where my problem, i don't know how to retrieve the field's value
        } catch (NoSuchFieldException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

堆栈跟踪

java.lang.IllegalArgumentException: Can not set int field com.database.User.userID to java.lang.String
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(Unknown Source)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(Unknown Source)
    at java.lang.reflect.Field.get(Unknown Source)
    at com.database.DatabaseObject.get(DatabaseObject.java:106)
    at com.database.DatabaseObject.set(DatabaseObject.java:128)
    at com.database.DatabaseObject.getInsertPreparedStatement(DatabaseObject.java:64)
    at com.database.Database.insert(Database.java:95)
    at com.lenabru.webservice.ElectronicArenaWebService.register(ElectronicArenaWebService.java:21)
    at com.database.Main.main(Main.java:29)

最佳答案

要获取此堆栈跟踪,您必须将字符串值传递给 field.get,而不是 this。进行完全重建并再次测试。

以下是 UnsafeFieldAccessorImpl 类中的相关方法,如您所见,如果您尝试传入一个 String 而不是可从声明字段的类:

protected void ensureObj(Object o) {
    // NOTE: will throw NullPointerException, as specified, if o is null
    if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) {
        throwSetIllegalArgumentException(o);
    }
}

protected void throwSetIllegalArgumentException(Object o) {
    throwSetIllegalArgumentException(o != null ? o.getClass().getName() : "", "");
}

protected void throwSetIllegalArgumentException(String attemptedType,
                                                String attemptedValue) {
    throw new IllegalArgumentException(getSetMessage(attemptedType,attemptedValue));
}

protected String getSetMessage(String attemptedType, String attemptedValue) {
    String err = "Can not set";
    if (Modifier.isStatic(field.getModifiers()))
        err += " static";
    if (isFinal)
        err += " final";
    err += " " + field.getType().getName() + " field " + getQualifiedFieldName() + " to ";
    if (attemptedValue.length() > 0) {
        err += "(" + attemptedType + ")" + attemptedValue;
    } else {
        if (attemptedType.length() > 0)
            err += attemptedType;
        else
            err += "null value";
    }
    return err;
}

关于java - 如何获取该类中某个字段的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18291954/

相关文章:

java - 使用查询缓存时,Hibernate 执行 N+1 个选择而不是 1 个查询

java - 从命令行创建骨架

c# - 使用反射加载程序集时的内存管理

performance - 声明 struct 字段的类型与 Julia 中的结构本身的类型相同

javascript - 输入字段调整大小

SharePoint:以编程方式从 MultiChoice 字段中获取值

java - 如何在 Swagger 中为无法访问的 Controller 记录其他模型?

java - 如何等待线程和处理程序初始化

c# - 通过 C# 中扩展方法的反射获取泛型重载

java - 具有泛型和反射的可扩展工厂类