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

fab*_*abb 8 java string reflection value-of

我正在设置Object thisvia反射的公共字段.字段名称和值均以String.我使用几种不同的字段类型:Boolean,Integer,Float,Double,的自己enum,和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));
   }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

mdm*_*dma 8

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

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