使用反射设置字段 - 字符串没有valueOf(String)方法

时间:2010-05-30 14:12:17

标签: java string reflection value-of

我正在通过反思设置Object this的公共字段。字段名称和值均以String给出。我使用了几种不同的字段类型:BooleanIntegerFloatDouble,自己的enumString

除了String 之外,它适用于所有人。抛出的异常是没有签名String.valueOf(String)的方法存在...现在我使用脏instanceof解决方法来检测每个字段是否为字符串,在这种情况下只需将值复制到字段。

private void setField(String field, String value) throws Exception {
   Field wField = this.getClass().getField(field);

   if(wField.get(this) instanceof String){ //TODO dirrrrty hack
    //stupid workaround as java.lang.String.valueOf(java.lang.String) fails...
    wField.set(this, value);
   }else{
    Method parseMethod = wField.getType().getMethod("valueOf", new Class[]{String.class});
    wField.set(this, parseMethod.invoke(wField, value));
   }
 }

任何想法如何避免这种解决方法?

您认为java.lang.String应该支持valueOf(String)方法吗?

感谢。

4 个答案:

答案 0 :(得分:8)

正如您所注意到的,没有String.valueOf(String)。但是,我不认为你的实现是一个hack,只是认识到JDK类中的微小不一致。

对于更强大的String to Object转换,您可以考虑使用PropertyEditors,它直接支持String to Object转换 - 默认情况下提供的原始类型和字符串的实现。)您的解析方法将是一致的,并且可扩展处理不同类型。更好的是Commons ConvertSpring 3 Type Converters中的转换类,因为它们仅仅专注于转换,而不是属性的GUI编辑。

答案 1 :(得分:0)

  

任何想法如何避免这种解决方法?

这在很大程度上取决于parseMethod的实施。

  

你认为java.lang.String应该支持方法valueOf(String)吗?

为什么?那将是一个无操作,只需返回其参数。

答案 2 :(得分:0)

  

您认为java.lang.String应该支持valueOf(String)方法吗?

没有。它几乎没有反射之外的价值,反正也不应该被鼓励( Effective Java 2nd Edition,Item 53:Prefer接口到反射)。

答案 3 :(得分:0)

如果是字符串:

方法parseMethod = wField.getType()。getMethod(“valueOf”,new Class [] {Object.class});

wField.set(this,parseMethod.invoke(wField,value));