一旦一个类被加载,是否有办法再次调用静态初始化器?
public class Foo {
static {
System.out.println("bar");
}
}
编辑:
我需要调用静态初始化器,因为我没有编写原始类,并且我需要调用的逻辑是在静态初始化器中实现的。
一旦一个类被加载,是否有办法再次调用静态初始化器?
public class Foo {
static {
System.out.println("bar");
}
}
编辑:
我需要调用静态初始化器,因为我没有编写原始类,并且我需要调用的逻辑是在静态初始化器中实现的。
如果同一个类被不同的ClassLoader加载多次,那么逻辑将会运行多次。需要注意的是,在这种情况下,它们实际上是不同的类。
通常情况下,这些只是一次性的操作。如果您想要能够多次调用逻辑,请像其他人建议的那样将其放在静态方法中。
我同意Earwicker的回答。只需将静态初始化提取到单独的静态方法中。
public class Foo {
static {
Foo.initialize();
}
public static void initialize() {
System.out.println("bar");
}
}
getDeclaredMethod(String name)
:getDeclaredMethods()
: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();
}
}
看看上面的内容是否按照你预期的顺序打印出来。在我的机器上,它可以正常工作。
虽然这完全是一种hack方法,而且非常脆弱。最好的方法是修改旧类,添加一个可以被覆盖的init()方法。