Есть такой код:
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), чтобы сослаться на поле объекта в списке?
Есть несколько подходов.
Можно воспользоваться 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");
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть лента которая реализована при помощи RecyclerView, заполняю её при помощи AsyncTask
Как можно центрировать элементы списка <li> относительно границ списка <ul>?
Здравствуйте! Я не могу понять, как можно сделать плавный эффект изменения позиции фона