我有一个类充当属性/配置类。除此之外,我还有一个包含属性的JSON文件。
现在,在我的主类中,我实例化一个属性对象,然后使用gson的fromJson方法将JSON文件读入此对象。然后我将它传递给我的其他类,以便他们能够访问属性。
我想重构我的设计,以便此属性类将具有静态变量和方法,因此我不必实例化它以访问属性。
我想知道使用gson是否可行,或者这个设计是个好主意。
谢谢!
答案 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'.