Использование файлов 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'.
Другие вопросы по тегам