8

我正在设置Object this通过反射的公共字段。字段名称和值均以 给出String。我使用了几种不同的字段类型:Boolean, Integer, Float, Double, an ownenum和 a String

它适用于所有这些,除了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

4 回答 4

8

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

对于更健壮的 String 到 Object 的转换,您可以考虑使用PropertyEditors,它直接支持 String 到 Object 的转换 - 默认提供的基本类型和字符串的实现。)然后您的 parse 方法将是一致的,并且可扩展以处理不同的类型。更好的是Commons ConvertSpring 3 Type Converters中的转换类,因为它们纯粹专注于转换,而不是属性的 GUI 编辑。

于 2010-05-30T14:38:08.153 回答
0

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

这在很大程度上取决于parseMethod.

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

做什么的?那将是一个无操作,只需返回它的参数。

于 2010-05-30T14:17:45.657 回答
0

如果是字符串:

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

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

于 2013-06-10T10:22:28.600 回答
0

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

不。它在反射之外几乎没有任何价值,无论如何都不应该鼓励反射(Effective Java 2nd Edition,Item 53: Prefer interfaces to reflection)。

于 2010-05-30T14:35:07.940 回答