1

假设我有一个像下面这样的类

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. 假设 myEnv.getProperties(String)不是纯粹的功能(即,它可以返回不同的值。如何?这里不重要)

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

(由于各种原因,我不能使这些字段成为非静态或非最终的。所以请不要建议像使 Foo 成为接口这样的解决方案,并覆盖各种 getter 方法)

谢谢

4

1 回答 1

1

不要这样做!

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

常数应该是常数。遵循最小惊讶原则,重构为更好的设计。


最少的重构建议

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

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

这有点难看,但它会让你到达你想去的地方,而无需求助于真正的黑客。

于 2013-12-16T19:26:59.607 回答