当前位置: 首页 > 面试题库 >

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

宦烈
2023-03-14
问题内容

Eclipse Plug- in对某些JAR文件有引用(在的Runtime选项卡中进行配置MANIFEST.MF)。我可以访问和实例化那些JAR文件中包含的类,因此它们包含在类路径中。

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

public class SomeStrategy extends Strategy {

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

}

我有几个此类都应该注册到的类StrategyRegistry(这只是一个static class带有a的类hashmap)。但是,每当我访问时StrategyRegistry,它都不包含任何值。

我读到静态初始值设定项是在首次加载该类时执行的,并且由于我没有在代码中的任何地方直接引用这些类,因此不会加载它们并且不会执行静态初始值设定项。

现在的问题是:我可以更改代码,以便我的类使用静态初始化程序自行注册吗?我明确地不想创建一个保存注册并在程序启动时读取注册的设置文件。最好使用课堂解决方案(我什至不知道是否可行)。


问题答案:

我读到静态初始值设定项是在首次加载该类时执行的,并且由于我没有在代码中的任何地方直接引用这些类,因此不会加载它们并且不会执行静态初始值设定项。

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

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

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



 类似资料:
  • 我通过解决一些黑客等级问题来学习java。下面的代码是关于学习静态初始值设定项块的。例外情况是thown和Capture,但程序仍在运行,我不确定原因。 输入:-1,2 预期输出:java.lang.例外:宽度和高度必须为正 实际输出:宽度和高度必须为正-2

  • 本文向大家介绍Oracle Listener 动态注册 与 静态注册,包括了Oracle Listener 动态注册 与 静态注册的使用技巧和注意事项,需要的朋友参考一下 一.什么是注册 注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。   在数据库服务器启动过程中,

  • 本文向大家介绍Oracle静态注册与动态注册详解,包括了Oracle静态注册与动态注册详解的使用技巧和注意事项,需要的朋友参考一下 一、概述:   Oracle的注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到这个数据库。这个服务名可能与实例名一样,也有可能不一样。   在数据库服务器启动过程中,数据库服务器会向监听程

  • 本文向大家介绍Android的广播Receiver动态注册和静态注册示例,包括了Android的广播Receiver动态注册和静态注册示例的使用技巧和注意事项,需要的朋友参考一下 广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低。 2.动态注册广播不是 常驻型

  • 问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§