Java 反射通用获取字段值

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

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

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

我怎样才能做到这一点?

回答:

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

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

}

}

以上是 Java 反射通用获取字段值 的全部内容, 来源链接: utcz.com/qa/435700.html

回到顶部