更新
由于原始答案中描述的方法(见下文)不支持原语,并且只能支持具有单个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());
}