Java:使用静态初始值设定项块将类注册到全局静态注册表

Java:使用静态初始值设定项块将类注册到全局静态注册表,java,static-initialization,Java,Static Initialization,我有一个Eclipse插件,它引用了一些JARs文件(在MANIFEST.MF的Runtime选项卡中配置)。我可以访问并实例化那些JARs文件中包含的类,因此它们包含在类路径中 我希望这些类将自己注册到全局静态注册表中,因此我向它们添加了一个静态初始值设定项块: public class SomeStrategy extends Strategy { static { StrategyRegistry.register("SomeStrategy", SomeStra

我有一个
Eclipse插件
,它引用了一些
JAR
s文件(在
MANIFEST.MF的
Runtime
选项卡中配置)。我可以访问并实例化那些
JAR
s文件中包含的类,因此它们包含在类路径中

我希望这些类将自己注册到全局静态注册表中,因此我向它们添加了一个静态初始值设定项块:

public class SomeStrategy extends Strategy {

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

}
我有几个类,它们都应该注册到
StrategyRegistry
(这只是一个
静态类,带有
hashmap
)。但是,每当我访问
策略注册表
,它都不包含任何值

我读到静态初始值设定项是在类第一次加载时执行的,因为我没有直接在代码中的任何地方引用这些类,所以不会加载它们,也不会执行静态初始值设定项

我现在的问题是:我可以修改代码,让我的类用静态初始值设定项自我注册吗?我明确地说,我不想创建一个设置文件来保存注册并在程序启动时读取它。最好是课堂解决方案(我不知道是否可能)

我读到静态初始值设定项是在类第一次加载时执行的,因为我没有直接在代码中的任何地方引用这些类,所以不会加载它们,也不会执行静态初始值设定项

这是正确的——除非您在某个地方访问该类,否则它的任何代码都不会执行。创建类的实例或访问类的静态属性将导致调用其静态初始值设定项,否则,将不会运行任何代码

此规则在调用静态初始值设定项时强制执行顺序,即,它确保在尝试访问类的任何属性之前始终调用静态初始值设定项,并且还避免了在程序启动时立即触发每个类的每个静态初始值设定项的问题


我不知道有什么方法可以使类或对象上的代码在没有访问该类或对象的东西的情况下运行。

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

你不能注册一个在插件启动时运行的静态初始化器类,在一个地方注册这些类吗?