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

我怎样才能做到这一点?

#1 热门回答(104 赞)

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

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

}

}

#2 热门回答(83 赞)

你应该通过该领域的对象方法,所以

Field field = object.getClass().getDeclaredField(fieldName);

field.setAccessible(true);

Object value = field.get(object);

#3 热门回答(15 赞)

我使用我的首选项类的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();

}

我希望它会帮助某人,因为我也有搜索过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值