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

时间:2015-02-02 22:10:45

标签: java static-initialization

我有Eclipse Plug-in个引用了一些JAR个文件(在Runtime的{​​{1}}标签中配置)。我可以访问和实例化那些MANIFEST.MF文件中包含的类,因此它们包含在类路径中。

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

JAR

我有几个类应该全部注册到public class SomeStrategy extends Strategy { static { StrategyRegistry.register("SomeStrategy", SomeStrategy.class); } } (只有StrategyRegistry static class)。但是,每当我访问hashmap时,它都不会保留任何值。

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

我现在的问题是:我可以更改代码,以便我的类使用静态初始化程序自行注册吗?我明确地不想在程序启动时创建一个包含注册和读取的设置文件。一个类内的解决方案(我不知道,如果可能的话)将是首选。

2 个答案:

答案 0 :(得分:4)

  

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

这是正确的 - 除非您在某处访问该类,否则不会执行任何代码。创建类的实例或访问类的静态属性将导致调用其静态初始化程序,否则将不会运行任何代码。

此规则强制对静态初始化程序的调用进行排序,也就是说,它确保在尝试访问类的任何属性之前始终调用静态初始化程序,并且还避免了为每个类创建每个静态初始化程序的问题程序启动时立即启动。

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

答案 1 :(得分:0)

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