2013-03-17 2 views
-1

У меня есть некоторое значение, которое я получаю в строковом формате из файла.Java/from string to java code

Например, в файле AI есть:

id = 342 
name = Jonatan 
country = USA 

Кроме того, у меня есть класс: person со следующими полями:

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

и у меня есть геттер и сеттер для всех полей ,

Теперь, я хочу создать новый экземпляр человека, представляющего Джонатана. Но - я не хочу обновлять все поле, только поля, которые мне нужны.

Итак, что я хочу сделать следующее: получить данные из файла, а затем для каждого из них установить и обновить правильное значение. Например, setName(Jonatan). Проблемы в том, что мой name находится в формате String. поэтому я не могу установить setName - потому что имя находится в строчном формате, а Java не дает мне возможность вызвать метод в строковом формате.

Есть простой способ для этого?

+2

"* Java не дает мне возможность вызова метода в строковом формате *" - Я не понимаю – Maroun

ответ

3

Вы можете посмотреть на Apache BeanUtils

Заявки довольно прост - вызов SETID ("42") человек по телефону:

PropertyUtils.setSimpleProperty(person, "id", "42"); 
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()); 
    } 
+2

Это должен быть комментарий. По крайней мере, покажите пример, если вы считаете это ответом – giorashc

+0

Обновленный ответ с примером – Joost

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 свойств.