-1

我有一些从文件中以字符串格式获得的值。

例如,在文件 AI 中有:

id = 342
name = Jonatan
country = USA

另外,我有 class:person下一个字段:

String id;
String name;
String country;
String grades;
String location;

我有所有领域的getter和setter。

现在,我想创建一个新的 person 实例,它代表 Jonatan。但是 - 我不想更新所有字段,只更新我需要的字段。

所以,我接下来要做的是:从文件中获取详细信息,然后为每个设置,并更新正确的值。例如,setName(Jonatan)。问题是我name的格式是字符串。所以我不能做 setName - 因为 name 是字符串格式,而 Java 没有给我以字符串格式调用方法的选项。

有简单的方法吗?

4

3 回答 3

3

你可以看看Apache BeanUtils

该应用程序非常简单 - 调用人员调用的 setId("42") :

PropertyUtils.setSimpleProperty(person, "id", "42");
于 2013-03-17T15:23:34.280 回答
1

使用 java 反射,您可以确定哪些方法/字段可用。

您可以使用此示例将键/值对传递到doReflection方法中,以在 Bean 类的实例中设置属性的新值。

public class Bean {

    private String id = "abc";

    public void setId(String s) {
        id = s;
    }

    /**
     * Find a method with the given field-name (prepend it with "set") and
     * invoke it with the given new value.
     * 
     * @param b The object to set the new value onto
     * @param field  The name of the field (excluding "set")
     * @param newValue The new value
     */
    public static void doReflection(Bean b, String field, String newValue) throws NoSuchMethodException,
            SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class<? extends Bean> c = b.getClass();
        Method id = c.getMethod("set" + field, String.class);
        id.invoke(b, newValue);
    }

    public static void main(String... args) throws NoSuchMethodException, SecurityException, IllegalArgumentException,
            InvocationTargetException, IllegalAccessException {
        Bean bean = new Bean();
        System.out.println("ID before: " + bean.id);
        doReflection(bean, "Id", "newValue");
        System.out.println("ID after: " + bean.id);

        // If you have a map of key/value pairs:
        Map<String, String> values = new HashMap<String, String>();
        for(Entry<String, String> entry : values.entrySet())
            doReflection(bean, entry.getKey(), entry.getValue());
    }
于 2013-03-17T15:20:30.610 回答
1

我喜欢@michael_s 的回答BeanUtils。如果你想不这样做,你可以写:

Person person = new Person();
Properties properties = new Properties();
properties.load(new FileInputStream("the.properties"));
for (Object key : properties.keySet()) {
    String field = (String) key;
    String setter = "set" + field.substring(0, 1).toUpperCase() + field.substring(1);
    Method method = Person.class.getMethod(setter, String.class);
    method.invoke(person, properties.get(key));
}

并不是说在使用后应该关闭流,并且这个简短的示例仅适用于String属性。

于 2013-03-17T15:35:04.487 回答