重新加载一个类,以便重新初始化其静态成员

时间:2013-12-16 19:23:36

标签: java dynamic-class-loaders

假设我有类似以下的课程

public class Foo
{
     public static final String FIELD_1 = Env.getProperties("one");
     public static final String FIELD_2 = Env.getProperties("one");

     //....
     public static final String FIELD_N = Env.getProperties("n");
}

显然,当我们第一次引用FIELD_*时,所有Foo都会被填充。 假设我的Env.getProperties(String)不是纯函数(即,它可以返回不同的值。如何?这里不重要)

如何强制类Foo被“重新加载”,以便重新执行所有类初始化代码(这样我可以为静态字段设置不同的值)?

(由于各种原因,我无法将这些字段设为非静态或非最终字段。 因此,请不要建议像make Foo这样的解决方案,并使用各种getter方法覆盖

由于

1 个答案:

答案 0 :(得分:1)

不要这样做!

您可以使用自定义类加载器或JRebel来完成它,但它将是一个巨大的bodge。不同的类可能从这些字段中读取了不同的值,并且彼此不同步等。

常量应该是常数。按照principle of least astonishment进行重构,以获得更好的设计。


最小重构建议

如果字段名称相当合适 - FIELD_1FIELD_2等 - 您可以使用FIELD_1()FIELD_2()来搜索并替换所有Java文件中对它们的引用。 {1}}。然后编写一些代码来用静态方法替换常量:

public static String FIELD_1() { return Env.getProperties("one"); }
public static String FIELD_2() { return Env.getProperties("two"); }
//etc.

它有点难看,但它会让你在不想诉诸真正黑客的情况下成为你想去的地方。