String to Object转换,

时间:2017-06-28 09:15:31

标签: java

我经常遇到需要将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,...)

1 个答案:

答案 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");
}