0

如何减少这种使用反射

private static Object determineDataType(final String value, String dataType)
{
    System.out.println("Name--->>" + dataType);
    if(dataType.equals(Boolean.class.getName()))
    {
       return new Boolean(value);
    }
    else if(dataType.equals(String.class.getName()))
    {
        return new String(value);
    }
    else if(dataType.equals(Character.class.getName()))
    {
        return new String(value);
    }
    else if(dataType.equals(Byte.class.getName()))
    {
        return new Byte(value);
    }
    else if(dataType.equals(Short.class.getName()))
    {
        return new Short(value);
    }
    else if(dataType.equals(Integer.class.getName()))
    {
        return new Integer(value);
    }
    else if(dataType.equals(Long.class.getName()))
    {
        return new Long(value);
    }
    else if(dataType.equals(Float.class.getName()))
    {
        return  new Float(value);
    }
    else if(dataType.equals(Double.class.getName()))
    {
        return  new Double(value);
    }
    //defualt return the String value, Lets' AOPI do the Validation
    return new String(value);
}
4

3 回答 3

1

我也想知道为什么你会这样做。但是,搁置一分钟,这里有一些未经测试的代码:

List<Class<?>> types = Arrays.asList(Long.class, Integer.class, ... );
for (Class<?> type : types) {
    if (type.getName().equals(dataType))
        return type.getConstructor(String.class).newInstance(value);
    // TODO: catch exceptions and probably re-throw wrapped
}
return new String(value);
于 2012-06-05T10:40:17.947 回答
1

您可以使用Class.forName和方法getConstructor这里是一个例子):

Object instance = Class.forName(dataType)
         .getConstructor(new Class[] {String.class})
         .newInstance(new Object[]{value});

顺便说一句,它不适用于 Character 和 Boolean,因为您对它们进行了特殊处理。

于 2012-06-05T10:47:40.573 回答
0

我认为您不能在这里通过反射减少代码量。首先,反射 API 非常冗长。其次,您在某些块中做的事情略有不同。特别是,布尔块不仅仅调用构造函数。

于 2012-06-05T10:50:29.270 回答