Использование файлов JSON для инициализации статического класса
У меня есть класс, который действует как класс свойств / конфигурации. В дополнение к этому у меня также есть файл JSON, который содержит свойства.
Прямо сейчас, в моем основном классе, я создаю экземпляр объекта свойства и затем использую метод fromJson для gson, чтобы прочитать файл JSON в этот объект. Затем я передаю это другим моим классам, чтобы они могли получить доступ к свойствам.
Я хочу реорганизовать свой дизайн, чтобы в этом классе свойств были статические переменные и методы, чтобы мне не приходилось создавать его экземпляры для доступа к свойствам.
Мне интересно, если это возможно с помощью gson, или этот дизайн хорошая идея.
Спасибо!
2 ответа
Вы можете использовать static
блок в классе свойств, верно? Инициализируйте поля там, как вы делаете сейчас. Сделать их final
чтобы избежать условий гонки.
Не стесняйтесь игнорировать людей, говорящих "не делай этого". Вы знаете свой код и требования лучше, чем мы.
То, что вы ищете, называется "отражение" в Java. Вы можете циклически перебирать пары ключ / значение JSON, затем искать поле с помощью отражения, а затем устанавливать поле с значением.
У этого вопроса есть хорошая разбивка о том, как это сделать.
Затем используйте статический блок инициализации, чтобы запустить функцию импорта.
Удачи!
РЕДАКТИРОВАТЬ:
Некоторые примеры кода, демонстрирующие, что это не какая-то сумасшедшая, сложная, нечитаемая, ужасная, бесполезная, очень плохая идея, которую должен когда-либо пытаться использовать только Джеймс Гослинг.:)
import java.lang.reflect.*;
import net.sf.json.*;
public class Test {
public static String hello = null;
static JSONObject readConfig() {
// fake read a config file
String settings = "{\"hello\": \"world\"}";
JSONObject obj = (JSONObject)JSONSerializer.toJSON(settings);
return obj;
}
static {
// load config into static variables
JSONObject config = Test.readConfig();
for (Object key : config.keySet()) {
String value = config.getString((String)key);
try {
Field field = Test.class.getDeclaredField((String)key);
field.set(null, value);
System.out.println("Set '"+ key +"' to '"+ value +"'.");
} catch (Exception e) {
System.err.println("Could not set unknown prop '"+ key +"' because "+ e +".");
}
}
}
public static void main(String[] args) {}
}
И это работает:
$ javac -cp .:/usr/share/java/* Test.java
$ java -cp .:/usr/share/java/* Test
Set 'hello' to 'world'.