在Java中解析String中的对象

Del*_*lip 7 java reflection types

我试图编写一个通用的方法来解析字符串中的对象.要清楚,我有以下不那么优雅的实现:

public static Object parseObjectFromString(String s, Class class) throws Exception {
  String className = class.getSimpleName();
  if(className.equals("Integer")) {
    return Integer.parseInt(s);
  }
  else if(className.equals("Float")) {
    return Float.parseFloat(s);
  }
  else if ...

}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这个?

Tru*_*oft 12

您的方法可以有一行代码:

public static <T> T parseObjectFromString(String s, Class<T> clazz) throws Exception {
    return clazz.getConstructor(new Class[] {String.class }).newInstance(s);
}
Run Code Online (Sandbox Code Playgroud)

使用不同的类测试:

Object obj1 = parseObjectFromString("123", Integer.class);
System.out.println("Obj: " + obj1.toString() + "; type: " + obj1.getClass().getSimpleName());
BigDecimal obj2 = parseObjectFromString("123", BigDecimal.class);
System.out.println("Obj: " + obj2.toString() + "; type: " + obj2.getClass().getSimpleName());
Object obj3 = parseObjectFromString("str", String.class);
System.out.println("Obj: " + obj3.toString() + "; type: " + obj3.getClass().getSimpleName());
Object obj4 = parseObjectFromString("yyyy", SimpleDateFormat.class);
System.out.println("Obj: " + obj4.toString() + "; type: " + obj4.getClass().getSimpleName());
Run Code Online (Sandbox Code Playgroud)

输出:

Obj: 123; type: Integer
Obj: str; type: String
Obj: 123; type: BigDecimal
Obj: java.text.SimpleDateFormat@38d640; type: SimpleDateFormat
Run Code Online (Sandbox Code Playgroud)


Chi*_*Uni 8

我不确定你要做什么.这是一些不同的猜测:

  • 您希望能够将对象转换为字符串,反之亦然.

你应该研究序列化.我使用XStream,但writeObjectjava.beans.XMLEncoder也可以使用.

  • 用户输入文本,并希望将其强制的"正确"类型的,其中也有不少.

通常,这意味着用户规范存在问题.你从用户那里收到了什么,为什么能有这么多种?

通常,您希望类型尽可能广泛:double如果它是一个数字,则使用,以及String几乎所有其他类型.然后从该变量构建其他东西.但是不要传递类型:通常,类型应该非常明显.