首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >反射泛型获取字段值

反射泛型获取字段值
EN

Stack Overflow用户
提问于 2012-11-15 22:55:24
回答 8查看 404.2K关注 0票数 156

我正在尝试通过反射获取字段的值。问题是我不知道字段的类型,必须在获取值时决定它。

此代码的结果为以下异常:

无法将java.lang.String字段com....fieldName设置为java.lang.String

代码语言:javascript
复制
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
        
Class<?> targetType = field.getType();
Object objectValue = targetType.newInstance();

Object value = field.get(objectValue);

我试图强制转换,但得到了编译错误:

代码语言:javascript
复制
field.get((targetType)objectValue)

代码语言:javascript
复制
targetType objectValue = targetType.newInstance();

我该怎么做呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-11-15 23:47:12

就像前面回答的那样,你应该使用:

代码语言:javascript
复制
Object value = field.get(objectInstance);

另一种方法是动态调用getter,这种方法有时更受欢迎。示例代码:

代码语言:javascript
复制
public static Object runGetter(Field field, BaseValidationObject o)
{
    // MZ: Find the correct method
    for (Method method : o.getMethods())
    {
        if ((method.getName().startsWith("get")) && (method.getName().length() == (field.getName().length() + 3)))
        {
            if (method.getName().toLowerCase().endsWith(field.getName().toLowerCase()))
            {
                // MZ: Method found, run it
                try
                {
                    return method.invoke(o);
                }
                catch (IllegalAccessException e)
                {
                    Logger.fatal("Could not determine method: " + method.getName());
                }
                catch (InvocationTargetException e)
                {
                    Logger.fatal("Could not determine method: " + method.getName());
                }

            }
        }
    }


    return null;
}

还要注意,当您的类从另一个类继承时,您需要递归地确定Field。例如,获取给定类的所有字段;

代码语言:javascript
复制
    for (Class<?> c = someClass; c != null; c = c.getSuperclass())
    {
        Field[] fields = c.getDeclaredFields();
        for (Field classField : fields)
        {
            result.add(classField);
        }
    }
票数 171
EN

Stack Overflow用户

发布于 2012-11-15 23:02:10

您应该将对象传递给字段的get方法,因此

代码语言:javascript
复制
  Field field = object.getClass().getDeclaredField(fieldName);    
  field.setAccessible(true);
  Object value = field.get(object);
票数 151
EN

Stack Overflow用户

发布于 2013-09-06 16:55:58

我使用preference类的toString()实现中的反射来查看类成员和值(简单快速的调试)。

我使用的简化代码如下:

代码语言:javascript
复制
@Override
public String toString() {
    StringBuilder sb = new StringBuilder();

    Class<?> thisClass = null;
    try {
        thisClass = Class.forName(this.getClass().getName());

        Field[] aClassFields = thisClass.getDeclaredFields();
        sb.append(this.getClass().getSimpleName() + " [ ");
        for(Field f : aClassFields){
            String fName = f.getName();
            sb.append("(" + f.getType() + ") " + fName + " = " + f.get(this) + ", ");
        }
        sb.append("]");
    } catch (Exception e) {
        e.printStackTrace();
    }

    return sb.toString();
}

我希望它能帮助一些人,因为我也搜索过了。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13400075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档