Java 再次调用静态初始值设定项
加载类后,是否有方法再次调用静态初始值设定项Java 再次调用静态初始值设定项,java,static,static-initializer,Java,Static,Static Initializer,加载类后,是否有方法再次调用静态初始值设定项 public class Foo { static { System.out.println("bar"); } } 编辑: 我需要调用静态初始值设定项,因为我没有编写原始类,我需要调用的逻辑在静态初始值设定项中实现。将初始化代码放在一个单独的公共静态方法中,这样您就可以从静态初始值设定项和其他地方调用它了?我同意Earwicker的回答。只需将静态初始化提取到单独的静态方法 public class Foo {
public class Foo {
static {
System.out.println("bar");
}
}
编辑:
我需要调用静态初始值设定项,因为我没有编写原始类,我需要调用的逻辑在静态初始值设定项中实现。将初始化代码放在一个单独的公共静态方法中,这样您就可以从静态初始值设定项和其他地方调用它了?我同意Earwicker的回答。只需将静态初始化提取到单独的静态方法
public class Foo {
static {
Foo.initialize();
}
public static void initialize() {
System.out.println("bar");
}
}
逻辑会多次运行的一种情况是,不同的类加载器多次加载该类。请注意,在本例中,它们本质上是不同的类
不过,一般来说,这些都是一次性交易。如果您希望能够多次调用该逻辑,请按照其他人的建议,将其放入静态方法。您可以尝试扩展包含静态代码的类,然后放入自己的静态初始值设定项。不太确定它是否有效,但:
public class Foo {
static {
Foo.initialize();
}
public static void initialize() {
System.out.println("bar");
}
}
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()方法,那就更好了 如果您真的想要确切问题的确切答案,答案是否定的。不可能通过反射调用静态初始值设定项或instanceInitializer 文件明确指出: 对于
getDeclaredMethod(字符串名称)
:
如果名称为“”或“”,则引发NoSuchMethodException
对于getDeclaredMethods()
:
返回的数组中不包括类初始化方法
因此,不,即使通过反射也不可能调用它。这里是我的一篇帖子,我重新加载了一个实用程序类,以重新运行静态初始值设定项进行单元测试。我试图找到一个关于类加载器的参考,但找不到一个好的参考。你有吗?唉,没有。我的知识是从VM规范、javadoc、服务器手册和各种互联网来源拼凑而成的。你可以做得比谷歌搜索“developerWorks”和“ClassLoader”更糟糕。这里的答案有一个小的类加载器示例:为什么是downvote?否决我的人能解释一下原因吗?我不能修改代码。它位于第三方库中,我不打算使用常规静态方法中的代码创建自己的发行版。:)我使用的解决方案是将代码复制并粘贴到另一个类中,这样它就可以在常规静态方法中。但我不喜欢它。德赖姆。。。然后我的下一个问题是,为什么第三方类在静态初始值设定项中有逻辑,您可能想重新调用它?!它将在静态初始化器上加载并处理一个XML配置文件,我想重新加载XML。。。我很同情你!:)