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。。。我很同情你!:)