一旦加载了一个类,有没有办法再次调用静态初始化器?
public class Foo {
static {
System.out.println("bar");
}
}
编辑:
我需要调用静态初始化程序,因为我没有编写原始类,而我需要调用的逻辑是在静态初始化程序中实现的。
答案 0 :(得分:10)
将初始化代码放在一个单独的公共静态方法中,以便您可以从静态初始化程序和其他地方调用它?
答案 1 :(得分:5)
逻辑运行多次的一种情况是,如果类被不同的ClassLoader加载多次。请注意,在这种情况下,它们本质上是不同的类。
但一般情况下,这些都是一次性交易。如果您希望能够多次调用逻辑,请按照其他人的建议进行操作,并将其置于静态方法中。
答案 2 :(得分:4)
我同意Earwicker的回答。只需将静态初始化提取到一个单独的静态方法。
public class Foo {
static {
Foo.initialize();
}
public static void initialize() {
System.out.println("bar");
}
}
答案 3 :(得分:0)
您可以尝试扩展包含静态代码的类,然后放入您自己的静态初始化程序。不太确定它是否有效,但是:
public class OldBadLibraryClass {
static {
System.out.println("oldBadLibrary static init");
}
}
//next file
public class MyBetterClass extends OldBadLibraryClass {
static {
System.out.println("MyBetterClass init");
}
}
public class Test {
public static void main(String[] args) {
new MyBetterClass();
}
}
看看上面是否按照您期望的顺序打印。在我的机器上,它工作。
虽然这完全是一个黑客,而且非常脆弱。修改旧类以获得可以覆盖的init()方法真的会好得多。
答案 4 :(得分:0)
如果你真的想要确切答案你的确切问题,答案是否定的。无法通过反射调用静态初始值设定项或instanceInitializer。
文档清楚地说:
代表getDeclaredMethod(String name)
:
如果名称是“< init>”或“< clinit>”引发NoSuchMethodException。
代表getDeclaredMethods()
:
类初始化方法不包含在返回的数组中。
所以不,即使通过反思也不可能调用它。
答案 5 :(得分:0)
这里https://stackoverflow.com/a/19302726/2300018是我的帖子,我重新加载一个实用程序类来重新运行静态初始化程序以进行单元测试。