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