Изменение значения поля объекта по его имени

397
17 января 2017, 23:13

Есть такой код:

import java.io.*;
import java.util.*;
import java.nio.file.*;
import java.util.regex.*;
public class CBFIni {
        public ArrayList<SectionFields> sectionData = new ArrayList<SectionFields>();
        Pattern patternParam = Pattern.compile("^[A-Za-z_0-9]+");
        Matcher matchParam, matchValue;
        String nameParam;
        public CBFIni() {
                try {
                        List<String> lines = Files.readAllLines(Paths.get("backups.conf"));
                        boolean checkSection = false;
                        int i = -1;
                        for(String line: lines){
                                if (line.length() > 0 && line.charAt(0) != '#') {
                                        if (!checkSection) {
                                                checkSection = true; // Отметка, что начались параметры секции
                                                sectionData.add(new SectionFields()); // Создаем новый элемент-объект списка
                                        }
                                        i++;
                                        matchParam = patternParam.matcher(line); // Выуживаем имя параметра
                                        if (matchParam.matches()) {
                                                nameParam = line.substring(matchParam.start(),matchParam.end()); // Имя параметра
                                                sectionData.get(sectionData.size()-1).(nameParam) = line.substring(matchParam.end()+1);
                                        }
                                } else {
                                        checkSection = false;
                                        i = -1;
                                }
                        }
                } catch (IOException e) {
                } 
        }
        public class SectionFields {
                String backup, description, type, server, folder;
                int days, weeks, monthes, years, masterDay;
        }
}

Что надо писать в строке

sectionData.get(sectionData.size()-1).(nameParam) = line.substring(matchParam.end()+1);

вместо (nameParam), чтобы сослаться на поле объекта в списке?

Answer 1

Есть несколько подходов.

Можно воспользоваться Reflection :

private static void setValue(Class<?> type, 
                             Object object, 
                             String paramName, 
                             String value) throws Exception {
    Field field;
    do {
        field = type.getDeclaredField(paramName);
        type = type.getSuperclass();
    } while (field != null && type != null);
    if (field == null)
        throw new IllegalArgumentException(
                          "can't find the field with name: " + paramName);
    field.setAccessible(true);
    field.set(object, value);
}

Либо MethodHandlers, что будет быстрее при неоднократном присваении:

private static Map<String, MethodHandle> getSetters(Class<?> type) throws Exception {
    Map<String, MethodHandle> setters = new HashMap<>();
    while (type != null) {
        for (Field field : type.getDeclaredFields()) {
            field.setAccessible(true);
            setters.put(field.getName(), MethodHandles
                                                      .lookup()
                                                      .unreflectSetter(field));
        }
        type = type.getSuperclass();
    }
    return setters;
}

Изменение значения, будет выглядить следующим образом:

Map<String, MethodHandle> setters = getSetters(SectionFields.class);
SectionFields obj = new SectionFields();
setters.get("backup").invoke(obj, "hello world");
READ ALSO
Как организовать подгрузку элементов?

Как организовать подгрузку элементов?

Есть лента которая реализована при помощи RecyclerView, заполняю её при помощи AsyncTask

704
Как получить value option у select

Как получить value option у select

Как передать id option а не имя? Например:

432
Как центрировать &lt;li&gt; относительно границ &lt;ul&gt;?

Как центрировать <li> относительно границ <ul>?

Как можно центрировать элементы списка <li> относительно границ списка <ul>?

357
Плавное изменение позиции фона

Плавное изменение позиции фона

Здравствуйте! Я не могу понять, как можно сделать плавный эффект изменения позиции фона

475