Java 字符串到对象的转换,

Java 字符串到对象的转换,,java,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;

有时我需要将
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框架中提供了类似的实用程序类或方法?
或者,其他框架提供了什么?(例如ApacheCommons、spring、guava等)

使用反射,您可以尝试查找带有字符串参数的构造函数并调用该构造函数

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

使用反射,您可以尝试找到带有字符串参数的构造函数并调用该构造函数

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

您从何处获取该字符串?@Tom可以是网页,也可以是xml文件,或者是http请求,或者是数据库中的csv文件。。。我在很多地方都遇到过同样的问题。而你是手动进行转换的,因为?已经有一些框架可以将CSV文件解析为Java模型、表行或解析XML文件。@Tom,没错,但这些框架在20年前并不存在。忘记CSV,让我们假设它是用于自定义文件格式的解组器。没有通用的字符串到对象功能。正是这些需求催生了XML等(例如protobuf)。Java非常注意类型安全,没有像Javascript这样的自动强制。在标准课上。我肯定有用于这些目的的库,但这取决于您如何找到它们。您从何处获取该字符串?@Tom可以是网页,也可以是xml文件,也可以是http请求,或者是数据库中的csv文件。。。我在很多地方都遇到过同样的问题。而你是手动进行转换的,因为?已经有一些框架可以将CSV文件解析为Java模型、表行或解析XML文件。@Tom,没错,但这些框架在20年前并不存在。忘记CSV,让我们假设它是用于自定义文件格式的解组器。没有通用的字符串到对象功能。正是这些需求催生了XML等(例如protobuf)。Java非常注意类型安全,没有像Javascript这样的自动强制。在标准课上。我相信有一些库可以实现这些目的,但是要找到它们,这取决于你自己。要编写既紧凑又高效的库是很困难的。(例如,在您的代码示例中,构造函数的使用是紧凑代码和效率之间的折衷。为了提高效率,您应该使用
valueOf
方法,因为它们使用缓存。)-这就是我认为此代码属于框架的原因。我的意思是:ApacheCommons有大量丑陋的大方法,他们似乎并不介意添加丑陋的大方法。我也不介意使用实用程序类来为我隐藏丑陋的代码。(例如,
org.apache.commons.lang.StringEscapeUtils
)(也可以使用反射来检查是否有
valueOf
方法,但一般来说反射也有它的价格)您的答案确实有贡献,谢谢。当然,反射代码要慢得多。如果它很关键,请使用原始代码。很难编写既紧凑又高效的代码。(例如,在您的代码示例中,构造函数的使用是紧凑代码和效率之间的折衷。为了提高效率,您应该使用
valueOf
方法,因为它们使用缓存。)-这就是我认为此代码属于框架的原因。我的意思是:ApacheCommons有大量丑陋的大方法,他们似乎并不介意添加丑陋的大方法。我也不介意使用实用程序类来为我隐藏丑陋的代码。(例如,
org.apache.commons.lang.StringEscapeUtils
)(也可以使用反射来检查是否有
valueOf
方法,但一般来说反射也有它的价格)您的答案确实有贡献,谢谢。当然,反射代码要慢得多。如果是关键的,请使用原始代码。