反射泛型获取字段值

新手上路,请多包涵

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

此代码导致此异常:

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

 Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);

Class<?> targetType = field.getType();
Object objectValue = targetType.newInstance();

Object value = field.get(objectValue);

我尝试强制转换,但出现编译错误:

 field.get((targetType)objectValue)

或者

targetType objectValue = targetType.newInstance();

我怎样才能做到这一点?

原文由 Ido Barash 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

就像之前回答的那样,您应该使用:

 Object value = field.get(objectInstance);

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

 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。例如,获取给定类的所有字段;

     for (Class<?> c = someClass; c != null; c = c.getSuperclass())
    {
        Field[] fields = c.getDeclaredFields();
        for (Field classField : fields)
        {
            result.add(classField);
        }
    }

原文由 Marius 发布,翻译遵循 CC BY-SA 3.0 许可协议

您应该将 对象 传递给 字段获取 方法,所以

  Field field = object.getClass().getDeclaredField(fieldName);
  field.setAccessible(true);
  Object value = field.get(object);

原文由 Dmitry Spikhalskiy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题