猿问

反射通用获取字段值

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


这段代码会导致以下异常:


无法将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();

我怎样才能做到这一点?


月关宝盒
浏览 1058回答 3
3回答

阿晨1998

像之前回答的那样,您应该使用:Object value = field.get(objectInstance);有时更喜欢的另一种方法是动态调用getter。示例代码:public static Object runGetter(Field field, BaseValidationObject o){&nbsp; &nbsp; // MZ: Find the correct method&nbsp; &nbsp; for (Method method : o.getMethods())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if ((method.getName().startsWith("get")) && (method.getName().length() == (field.getName().length() + 3)))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (method.getName().toLowerCase().endsWith(field.getName().toLowerCase()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // MZ: Method found, run it&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return method.invoke(o);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (IllegalAccessException e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Logger.fatal("Could not determine method: " + method.getName());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch (InvocationTargetException e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Logger.fatal("Could not determine method: " + method.getName());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return null;}还应注意,当您的类继承自另一个类时,您需要递归确定Field。例如,获取给定类的所有字段;&nbsp; &nbsp; for (Class<?> c = someClass; c != null; c = c.getSuperclass())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Field[] fields = c.getDeclaredFields();&nbsp; &nbsp; &nbsp; &nbsp; for (Field classField : fields)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.add(classField);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }

忽然笑

尽管我不清楚您要实现的目标,但我在您的代码中发现了一个明显的错误:&nbsp; Field.get()期望包含该字段的对象作为参数,而不是该字段的某些(可能)值。所以你应该有field.get(object)。由于您似乎正在寻找字段值,因此可以通过以下方式获得该值:Object objectValue = field.get(object);无需实例化字段类型并创建一些空/默认值;也许我错过了一些东西。
随时随地看视频慕课网APP

相关分类

Java
我要回答