为了账号安全,请及时绑定邮箱和手机立即绑定

反射通用获取字段值

反射通用获取字段值

月关宝盒 2019-10-26 11:10:21
我试图通过反射接收字段值。问题是我不知道字段类型,必须在获取值时决定它。这段代码会导致以下异常:无法将java.lang.String字段com .... fieldName设置为java.lang.StringField 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();我怎样才能做到这一点?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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


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);

        }

    }


查看完整回答
反对 回复 2019-10-26
?
忽然笑

TA贡献1806条经验 获得超5个赞

尽管我不清楚您要实现的目标,但我在您的代码中发现了一个明显的错误:  Field.get()期望包含该字段的对象作为参数,而不是该字段的某些(可能)值。所以你应该有field.get(object)。


由于您似乎正在寻找字段值,因此可以通过以下方式获得该值:


Object objectValue = field.get(object);

无需实例化字段类型并创建一些空/默认值;也许我错过了一些东西。


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 1057 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信