Java: 使用静态初始化块将 类 注册到全局静态注册表

Java: use static initializer blocks to register classes to global static registry

我有一个 Eclipse Plug-in 引用了一些 JARs 文件(在 MANIFEST.MFRuntime 选项卡中配置)。我可以访问和实例化那些 JARs 文件中包含的 classes,因此它们包含在 classpath 中。

我希望 classes 将自己注册到全局静态注册表中,因此我为所有这些添加了一个静态初始化程序块:

public class SomeStrategy extends Strategy {

    static {
        StrategyRegistry.register("SomeStrategy", SomeStrategy.class);
    }

}

我有几个 class 应该都将自己注册到 StrategyRegistry(这只是一个 static class 和一个 hashmap)。但是,每当我访问 StrategyRegistry 时,它都没有任何值。

我读到静态初始化器在 class 首次加载时执行,因为我没有在代码中的任何地方直接引用那些 classes,所以它们没有被加载,静态初始化器是未执行。

我现在的问题是:我可以更改代码以便我的 classes 使用静态初始值设定项自行注册吗?我明确地不想创建一个设置文件来保存注册并在程序启动时读取它。 in-class 解决方案(我不知道是否可能)将是首选。

I read that the static initializers are executed when the class is first loaded and since I do not reference those classes anywhere in code directly, they are not loaded and the static initializers are not executed.

这是正确的——除非您在某处访问 class,否则其代码的 none 将永远被执行。创建 class 的实例或访问 class 上的静态 属性 将导致调用其静态初始化程序,但除此之外,不会有任何代码 运行.

此规则强制调用静态初始化器的顺序,也就是说,它确保在任何尝试访问 class 的任何属性之前始终调用静态初始化器,并且还避免了具有每个 class 的每个静态初始化程序都会在程序启动时立即触发。

我不知道有什么方法可以使 class 上的代码或对象成为 运行 而无需在某处访问 class 或对象。

首先你应该知道你的 static code block 在你访问 Class 文件之前永远不会被调用。我的意思是您应该至少访问一次您的 class 文件,例如 SomeStrategy.doSomething()SomeStrategy s = new SomeStrateg() 这些代码将访问您的 class 文件,并且在执行任何操作之前,您的静态块将是调用然后将调用您尝试调用的方法。 最后,如果你想注册每个 class 你可以创建一个 Registrar class 它会创建你的 classes 的每个实例,这将是 registrered.It 会导致调用您的静态代码块。