Java Reflection - 在不同类型上调用 valueOf

问题描述 投票:0回答:1

我尝试使用反射在不同类型(例如整数、字符串等)上调用 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));
}
java reflection
1个回答
0
投票

您可以使用类型构造函数(带有 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
© www.soinside.com 2019 - 2024. All rights reserved.