更新
由于原始答案中描述的方法(见下文)不支持原语,并且只能支持具有单个String参数的构造函数的类,因此最好为每个类显式指定要使用的解析器方法。
使用 Java 8 方法引用,这变得容易得多。
如您所见,即使是原始值也可以使用适当的 parse 方法进行处理,但是parse()这里的方法仍然返回Object,因此任何原始值仍然被装箱。通过反射处理基元时通常是这种情况。
这是一个简化的例子。有关完整的工作示例,请参见IDEONE。
private static HashMap<Class<?>, Function<String,?>> parser = new HashMap<>();
static {
parser.put(boolean.class , Boolean::parseBoolean); // Support boolean literals too
parser.put(int.class , Integer::parseInt);
parser.put(long.class , Long::parseLong);
parser.put(Boolean.class , Boolean::valueOf);
parser.put(Integer.class , Integer::valueOf);
parser.put(Long.class , Long::valueOf);
parser.put(Double.class , Double::valueOf);
parser.put(Float.class , Float::valueOf);
parser.put(String.class , String::valueOf); // Handle String without special test
parser.put(BigDecimal.class, BigDecimal::new);
parser.put(BigInteger.class, BigInteger::new);
parser.put(LocalDate.class , LocalDate::parse); // Java 8 time API
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Object parse(String argString, Class param) {
Function<String,?> func = parser.get(param);
if (func != null)
return func.apply(argString);
if (param.isEnum()) // Special handling for enums
return Enum.valueOf(param, argString);
throw new UnsupportedOperationException("Cannot parse string to " + param.getName());
}
原始答案
Javadoc for Number(Java 7) 列出了以下“直接已知的子类”,以及解析单个String参数的所示方法:
Byte, new Byte(String s), valueOf(String s),decode(String nm)
Short, new Short(String s), valueOf(String s),decode(String nm)
Integer, new Integer(String s), valueOf(String s),decode(String nm)
Long, new Long(String s), valueOf(String s),decode(String nm)
Double, new Double(String s),valueOf(String s)
Float, new Float(String s),valueOf(String s)
BigDecimal,new BigDecimal(String val)
BigInteger,new BigInteger(String val)
AtomicInteger
AtomicLong
如您所见,最好使用带String参数的构造函数。BigDecimal这种方式也将得到支持BigInteger。
现在,至于如何。使用反射。你有Class, 所以向它询问构造函数,然后调用它。
Class param = /*code here*/;
String argString = /*code here*/;
Object ret;
try {
Constructor ctor = param.getConstructor(String.class);
ret = ctor.newInstance(argString);
} catch (ReflectiveOperationException e) {
throw new UnsupportedOperationException("Cannot convert string to " + param.getName());
}