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)
我不确定你要做什么.这是一些不同的猜测:
你应该研究序列化.我使用XStream,但writeObject和java.beans.XMLEncoder也可以使用.
通常,这意味着用户规范存在问题.你从用户那里收到了什么,为什么能有这么多种?
通常,您希望类型尽可能广泛:double如果它是一个数字,则使用,以及String几乎所有其他类型.然后从该变量构建其他东西.但是不要传递类型:通常,类型应该非常明显.