问题标签 [static-initializer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
216 浏览

java - 干扰 emma 的静态初始化程序

我编写了一个类,其中包含 JUnit/emma 的每一行(它是一个相当基本的类)。

Emma 的 eclipse 输出以绿色(覆盖)显示所有行。但是,艾玛的报告 (HTML) 显示我错过了 1 条指令。它以黄色突出显示类(公共类 X)。

错过的指令似乎与“静态初始化程序”有关。我对他们很熟悉,而这个特殊的班级没有

挡在里面。它根本没有静态方法。它确实有 4 个公共静态最终整数。它还包含一个枚举。

HTML 输出表明:

作为未涵盖的指令(和方法)。

这个神秘的指令是从哪里来的?我该如何测试它?

我在这个文件中没有任何内部类,我什至无法解释 $1 的来源。

0 投票
1 回答
143 浏览

java - 如果放置在声明之前,则静态初始化程序错误

我注意到静态初始化程序中的某些内容可能是 javac 中的错误。我已经构建了一个场景,我可以为变量分配一个值,但不能读回该值。

下面是两个示例,第一个编译正常,第二个在尝试从 tmp 读取值时出错,但由于某种原因,允许将值分配给 tmp。我可以理解它是否既不能读取也不能写入变量,因为 tmp 是在静态初始化程序之后声明的,但是仅其中一个错误对我来说没有意义。

为了进一步强调这一点,这确实编译成功。

0 投票
6 回答
7923 浏览

java - 如果在引用类之前不调用静态初始化程序,如何注册java类

我有一个由执行文件处理的类实现的接口,比如搜索或其他。

然后我对每种文件类型都有不同的实现:

因此,我有处理器的 Utilizer,它有一个允许注册每个类的方法,如下所示:

到目前为止一切正常。

现在,我提供了我的接口的许多实现。

而且我很想为每个实现类提供一个静态初始化程序,该初始化程序在 Utilizer 中注册自身,在我之前的 TxtProcessor 的情况下,它将是:

问题是这个静态方法永远不会被调用,因为在应用程序的“静态可达”代码中没有对我的 TxtProcessor 类的引用,因为它是通过反射实例化的。所以jvm不调用静态初始化器。

假设我有两个部分:作为 Utilizer 的“通用代码”,另一方面是实现;它必须被认为是动态提供的东西,因此 Utilizer 部分不知道它。
事实上,这个想法正是每个类都会注册自己,而不会触及 Utilizer。
我很难想出一个不将某种形式的实现“知识”放在 Utilizer 端(并且保持简单)的解决方案,只是因为未调用静态初始化程序的问题。如何克服这一点?

0 投票
1 回答
168 浏览

java - 什么时候使用初始化器?

我最近遇到了以下一点 java 语法:

显然,这被称为“静态初始化程序”(参见Java 中的静态块),并且“在加载类时执行”。什么时候应该使用静态初始化器?与仅以通常的方式初始化变量相比,它的优点和缺点是什么?

0 投票
0 回答
75 浏览

java - Java中的静态初始化器和最终常量

给定以下Java中的简单代码。

在这个最简单的 Java 代码中,static构造函数应该被调用,当类Demo被通过main()方法初始化Demo.serialVersionUID但它没有被初始化时。

如果这个程序在没有修改的情况下运行,输出将只是1(消息 -调用静态构造函数。块中指定的static将不会显示)。


如果我们希望按照初始化程序中指定的方式打印消息,static那么我们需要修改Demo类中的声明语句,

要么,

删除final修饰符,或者,

将原始类型long更改为其相应的包装类型Long

那么,为什么它会这样呢?为什么在static没有对程序进行指定更改的情况下,它不会在构造函数中显示消息?

0 投票
3 回答
291 浏览

c++ - 静态初始化数组联合的结构

我正在尝试为此类编写静态初始化程序:

我已经尝试过这个,还有很多变种,似乎我尝试的任何方法都行不通。

有谁知道如何或是否可以静态初始化它?

0 投票
2 回答
631 浏览

java - 来自静态初始化器的静态最终字段初始化

为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始化程序访问静态最终字段?

起初,我认为这是一个 Eclipse 错误:

日食错误?

我还缺乏一些知识,因为静态初始化器不是我的日常工作。但是你瞧,这在没有类限定符的情况下可以正常工作:

缺少知识?

为了完成我的测试系列,我在 bash 中试了一下:

该死!

导致同样的结果。

这引出了最后一个问题:

从静态初始化块访问静态最终字段时,是否有任何理由禁止类限定符?因为声明类之前没有初始化?

0 投票
3 回答
3357 浏览

java - 为什么内部类不能使用静态初始化器?

Quoth JLS #8.1.3

内部类不能声明静态初始化器§8.7)......

这被证明是这样的:

现在既然 Java 的内部(非静态)类像其他所有类一样由类加载器加载,为什么我们不能为它们设置静态初始化器呢?

这种限制背后的原因是什么?

0 投票
2 回答
4696 浏览

java - 测试类静态初始化程序的最佳方法是什么?

我有一个具有相当复杂的静态初始化的类。我正在从目录中读取文件,然后解析这些 json 文件,映射到对象,并填写一个列表。你可以想象,可能会出现一些异常,我需要覆盖并测试这些代码分支。问题是这个静态初始化只运行一次/Testcase 文件。我遇到的解决方案:

  • 每个行为的新测试用例文件
  • 卸载静态类
  • 新的JVM

我对这些选项不感兴趣,难道没有更好的选择吗?

0 投票
1 回答
555 浏览

java - Java ClassLoader 问题或并发错误?

在 WebLogic 应用程序运行良好几周后,我突然收到一个异常:

之后应用程序完全失效,NoClassDefFoundError直到应用程序服务器重新启动。

完整的堆栈跟踪显示问题的根源是ConcurrentModificationException在静态初始化程序中。

具体等效/最小化代码如下:

这是异常的起源:

因此,似乎在应用程序运行时的某个时刻,WebLogic 决定从中重新加载类,package b但是当静态块运行时,它发现Properties对象已被修改。

我不知道它是被同时调用还是被多次调用。可能该Properties对象是应用程序第一次加载时创建的原始实例,并且CommonStuff类的重新加载试图putAll()再次调用。

如果我这样做会有所帮助:

我不能盲目地尝试,因为它在一家大公司的生产应用程序中。所以我试图了解我哪里出错了,以及如何在半夜重新加载类时对这些变量进行属性初始化。

有任何想法吗?

这可能是 WebLogic ClassLoader 问题吗?