我尝试使用反射在不同类型(例如整数、字符串等)上调用 valueOf 方法。
我想知道如何使用反射来调用这个方法只有一个
getMehod()
。
问题是,当类型为
java.lang.String
时,valueOf
方法不接受 String 参数,而当类型为 Integer 或其他类型时,valueOf 方法不接受 Object.class
。
我使用了一个 if 子句来区分它们,如下所示,但我想删除 if 子句。
private static void setFieldValue(String fieldName, String fieldValue, Rule rule) throws Exception {
Field field = Rule.class.getDeclaredField(fieldName);
field.setAccessible(true);
Class<?> type = field.getType();
Method valueOf;
// here I checked the type
if (String.class.equals(type))
valueOf = type.getMethod("valueOf", Object.class);
else
valueOf = type.getMethod("valueOf", String.class);
field.set(rule, valueOf.invoke(null, fieldValue));
}
您可以使用类型构造函数(带有 String arg)而不是 valueOf 方法:
static class Rule {
private String stringField;
private Integer integerField;
private Double doubleField;
private Long longField;
private Boolean booleanField;
private BigDecimal bigDecimalField;
}
public static void main(String[] args) throws Exception {
Rule rule = new Rule();
setFieldValue(rule, "stringField", "string val");
setFieldValue(rule, "integerField", "12");
setFieldValue(rule, "doubleField", "1.23");
setFieldValue(rule, "longField", "19877754");
setFieldValue(rule, "booleanField", "false");
setFieldValue(rule, "bigDecimalField", "879565.3565754");
System.out.println(rule.stringField);
System.out.println(rule.integerField);
System.out.println(rule.doubleField);
System.out.println(rule.longField);
System.out.println(rule.booleanField);
System.out.println(rule.bigDecimalField);
}
private static void setFieldValue(Rule rule, String fieldName, String fieldValue) throws Exception {
Field field = Rule.class.getDeclaredField(fieldName);
field.setAccessible(true);
Class<?> type = field.getType();
Constructor<?> valueOf = type.getConstructor(String.class);
field.set(rule, valueOf.newInstance(fieldValue));
}
输出:
string val
12
1.23
19877754
false
879565.3565754