【问题标题】:Can one force execution of the static blocks of all the files in the application?可以强制执行应用程序中所有文件的静态块吗?
【发布时间】:2016-01-25 11:09:30
【问题描述】:

我的目标是让几个类在程序开始时运行一段代码。假设可以一时兴起将类添加到项目中,而在main 开头调用的静态函数将是不切实际的。

我试图将初始化例程放在这些类的静态块中,它几乎按预期工作,但不完全。只有在该类中的其他内容被调用后,这些块才会被调用。这可以通过下面的代码来证明:

Test.java

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Begin");
        new Another();
    }
}

另一个.java

public class Another
{
    static
    {
        System.out.println("Another.static{}");
    }
    public Another()
    {
        System.out.println("Another.Another()");
    }
}

Another2.java

public class Another2
{
    static
    {
        System.out.println("Another2.static{}");
    }
    public Another2()
    {
        System.out.println("Another2.Another2()");
    }
}

输出是:

Begin
Another.static{}
Another.Another()

可以看出Another2被假定为根本不存在。

问题是:如果所有类都有静态块,是否有可能“踢”它们执行它们的静态块?

【问题讨论】:

    标签: java static-block


    【解决方案1】:

    如果类由 ClassLoader 加载,则执行静态块。因此,如果您遍历所有类并通过类加载器加载它们(无需实例化它们!)每个静态块都会执行一次。

    在更深层次上,我无法想象你真正需要这个的情况。这在某种程度上暗示了错误设计的类结构。

    【讨论】:

      【解决方案2】:

      这是不可能的,因为 VM 永远不会尝试加载其自身遍历的代码路径不需要的类。这样做有一些明显和一些模糊的原因。

      经验法则是:如果从程序入口点(通过代码)可访问的类不存在依赖关系,则该类将永远被加载。虽然 reachable 很迷茫,例如只需知道一个类的名称(例如,从配置文件中)并使用例如访问该类就可以建立一个引用。 Class.forName()。

      您无法实现的只是将一个类放入类路径并让该类自动成为一个额外的入口点(执行任何静态代码而没有来自主(也是唯一)入口点的原因将归类为)。

      【讨论】:

        【解决方案3】:

        只是你不能。仅当类加载器第一次将静态块加载到其中时才调用静态块。没有其他方法可以打电话给他们。

        加载所有内容以供您以后使用是没有意义的。无论如何,它会在您使用时执行。

        【讨论】:

          猜你喜欢
          • 2011-07-12
          • 2018-04-30
          • 2019-11-09
          • 1970-01-01
          • 2021-01-19
          • 1970-01-01
          • 2014-08-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多