reflection通用获取字段值
我试图通过reflection来接收字段值。 问题是我不知道字段types,并得到价值时,必须决定它。
这个代码导致这个例外:
无法将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);
另一种有时候最好的方式是dynamic地调用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; }
另外请注意,当你的类inheritance自另一个类时,你需要recursion确定Field。 例如,获取给定类的所有字段;
for (Class<?> c = someClass; c != null; c = c.getSuperclass()) { Field[] fields = c.getDeclaredFields(); for (Field classField : fields) { result.add(classField); } }
你应该通过一个对象来获得该领域的方法,所以
Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); Object value = field.get(object);
我使用我的首选项类的toString()实现中的reflection来查看类成员和值(简单和快速debugging)。
我正在使用的简化代码:
@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(); }
我希望这会帮助别人,因为我也搜遍了。
虽然我不清楚你想达到什么目的,但是我发现你的代码有一个明显的错误: Field.get()
期望包含该字段的对象作为参数,而不是该字段的某个(可能的)值。 所以你应该有field.get(object)
。
由于您似乎在寻找字段值,您可以获得:
Object objectValue = field.get(object);
不需要实例化字段types并创build一些空的/默认值; 或者也许有一些我错过了。
Integer typeValue = 0; try { Class<Types> types = Types.class; java.lang.reflect.Field field = types.getDeclaredField("Type"); field.setAccessible(true); Object value = field.get(types); typeValue = (Integer) value; } catch (Exception e) { e.printStackTrace(); }
你打电话给错了。
它应该是:
Object value = field.get(object);