我正在尝试通过反射获取字段的值。问题是我不知道字段的类型,必须在获取值时决定它。
此代码的结果为以下异常:
无法将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();
我该怎么做呢?
发布于 2012-11-15 23:47:12
就像前面回答的那样,你应该使用:
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);
}
}
发布于 2012-11-15 23:02:10
您应该将对象传递给字段的get方法,因此
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(object);
发布于 2013-09-06 16:55:58
我使用preference类的toString()实现中的反射来查看类成员和值(简单快速的调试)。
我使用的简化代码如下:
@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();
}
我希望它能帮助一些人,因为我也搜索过了。
https://stackoverflow.com/questions/13400075
复制相似问题