我经常遇到需要将String
值转换为对象的情况。通常我最终会使用自定义方法。
以下是一个例子:
@Nullable
public static Object valueOf(Class pParamType, String pValue)
{
if (pValue == null) return null;
if ("null".equals(pValue)) return null;
if (String.class.equals(pParamType)) return pValue;
if (Number.class.equals(pParamType)) return Double.valueOf(pValue);
if (Long.class.equals(pParamType) || Long.TYPE.equals(pParamType)) return Long.valueOf(pValue);
if (Double.class.equals(pParamType) || Double.TYPE.equals(pParamType)) return Double.valueOf(pValue);
if (Integer.class.equals(pParamType) || Integer.TYPE.equals(pParamType)) return Integer.valueOf(pValue);
if (Byte.class.equals(pParamType) || Byte.TYPE.equals(pParamType)) return Byte.valueOf(pValue);
if (Short.class.equals(pParamType) || Short.TYPE.equals(pParamType)) return Short.valueOf(pValue);
if (Float.class.equals(pParamType) || Float.TYPE.equals(pParamType)) return Float.valueOf(pValue);
if (Date.class.equals(pParamType))
{
try
{
return Formatter.parse(pValue, DATE_PATTERN);
}
catch (Exception e)
{
throw new IllegalArgumentException("Illegal date format");
}
}
if (Boolean.class.equals(pParamType) || Boolean.TYPE.equals(pParamType))
{
return Boolean.valueOf(pValue);
}
throw new IllegalArgumentException("Parameters of type [" + pParamType.getName() + "] are not supported");
}
我确实意识到转换为任何对象是不可能的。但是大多数java.lang
类确实有valueOf
方法
但我讨厌重复自己,我觉得应该有一些东西已经做了同样的事情,甚至可能涵盖更多。
我的问题是:
jdk是否在java框架中提供了类似的实用程序类或方法? 或者其他框架提供什么? (例如apache commons,spring,guava,...)
答案 0 :(得分:2)
使用反射,您可以尝试使用String参数查找构造函数并调用构造函数
public static void main(String[] args) throws Exception{
System.out.println(valueOf(String.class, ""));
System.out.println(valueOf(Long.class, "1"));
System.out.println(valueOf(Integer.class, "1"));
System.out.println(valueOf(Byte.class, "1"));
System.out.println(valueOf(Short.class, "1"));
System.out.println(valueOf(Double.class, "1.1"));
System.out.println(valueOf(Float.class, "1.1"));
System.out.println(valueOf(Boolean.class, "true"));
}
public static Object valueOf(Class pParamType, String pValue) throws Exception
{
if (pValue == null) return null;
if ("null".equals(pValue)) return null;
Constructor constructor = pParamType.getConstructor(String.class);
if (constructor!=null) {
return constructor.newInstance(pValue);
}
//... keep the logic for Date
throw new IllegalArgumentException("Parameters of type [" + pParamType.getName() + "] are not supported");
}