使用JSON文件初始化静态类

时间:2017-07-05 20:20:25

标签: java json gson

我有一个类充当属性/配置类。除此之外,我还有一个包含属性的JSON文件。

现在,在我的主类中,我实例化一个属性对象,然后使用gson的fromJson方法将JSON文件读入此对象。然后我将它传递给我的其他类,以便他们能够访问属性。

我想重构我的设计,以便此属性类将具有静态变量和方法,因此我不必实例化它以访问属性。

我想知道使用gson是否可行,或者这个设计是个好主意。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在属性类中使用static块,对吗?像现在这样在那里初始化字段。让他们final以避免竞争条件。

答案 1 :(得分:-2)

随意忽略那些说“不要那样做”的人。您比我们更了解您的代码和要求。

您正在寻找的内容在java中称为“反射”。你可以循环你的JSON键/值对,然后使用反射查找字段,然后设置字段w /值。

This question对如何做到这一点有很好的细分。

然后使用静态初始化块启动导入功能。

祝你好运!

修改

一些示例代码显示这不是一些疯狂,复杂,难以理解的可怕,不好,非常糟糕的想法,只有詹姆斯戈斯林应该尝试。 :)

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'.