我有一个java.lang.reflect.InvocationHandler,我需要实现方法invoke()
java.lang.reflect.InvocationHandler
我java.lang.String从阐述中得到了一个类型值,我需要将该值转换为方法所期望的适当returnType(它可以是诸如int,boolean,double或wrapper类之类的原语,如Boolean,Integer,Double,Float等) 。
java.lang.String
例:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String computedValue = compute(...); return convert(method.getReturnType(), computedValue); } private Object convert(Class<?> returnType, String stringValue) { return ...; // what's the simplest way? }
我不希望简单地实现复杂对象之间的自动转换,但是我希望有一种简单的方法将String转换为标准Java类型。
我已经看过很多次这样的东西了,但是对我来说似乎不合适:
public static Object toObject( Class clazz, String value ) { if( Boolean.class.isAssignableFrom( clazz ) ) return Boolean.parseBoolean( value ); if( Byte.class.isAssignableFrom( clazz ) ) return Byte.parseByte( value ); if( Short.class.isAssignableFrom( clazz ) ) return Short.parseShort( value ); if( Integer.class.isAssignableFrom( clazz ) ) return Integer.parseInteger( value ); if( Long.class.isAssignableFrom( clazz ) ) return Long.parseLong( value ); if( Float.class.isAssignableFrom( clazz ) ) return Float.parseFloat( value ); if( Double.class.isAssignableFrom( clazz ) ) return Double.parseDouble( value ); return value; }
到目前为止,以上都不是我所看到的最糟糕的情况:)
有人在这里有个秘密把戏吗?
据我所知,没有什么可以替代您介绍的版本。您可以稍微简化一下(因为包装器类型均为all final),但是实际上您需要使用if或switch或散列来打开类。
final
if
switch
我的建议是像上面这样编码。丑陋的代码 本身 仅是一个问题 , 如果您必须看一下的话。因此,将其放在实用程序方法中,不再赘述。
FWIW-这就是我简化方法的方式:
public static Object toObject( Class clazz, String value ) { if( Boolean.class == clazz ) return Boolean.parseBoolean( value ); if( Byte.class == clazz ) return Byte.parseByte( value ); if( Short.class == clazz ) return Short.parseShort( value ); if( Integer.class == clazz ) return Integer.parseInt( value ); if( Long.class == clazz ) return Long.parseLong( value ); if( Float.class == clazz ) return Float.parseFloat( value ); if( Double.class == clazz ) return Double.parseDouble( value ); return value; }
这更简单,更有效。它等同于原始版本,因为类是全部,final并且因为规范指出Class对象的相等性是对象身份。
Class
可以说,我们应该使用<wrapper>.valueOf(String)直接返回包装对象的方法。
<wrapper>.valueOf(String)
我没有断言这不是很丑。但是“美”不是衡量代码质量的有用方法,因为它是主观的,并且因为它不能告诉您代码是否易于理解和/或维护。
更新
为了同样支持基本类型,请在if条件中添加相应的类;例如
if (Boolean.class == clazz || Boolean.TYPE == clazz) { return Boolean.parseBoolean(value); }
现在可能已经到了点,在类型名称上执行String切换更为有效,尽管还需要考虑一些类型标识的棘手问题。(理论上,您可以有多个具有相同全名的类型,这些类型由不同的类加载器加载。我认为您需要在类加载器中“快速而轻松地播放”,以使用原始包装器类来实现这一点……但是我认为仍然有可能。)