问题标签 [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.
java - 干扰 emma 的静态初始化程序
我编写了一个类,其中包含 JUnit/emma 的每一行(它是一个相当基本的类)。
Emma 的 eclipse 输出以绿色(覆盖)显示所有行。但是,艾玛的报告 (HTML) 显示我错过了 1 条指令。它以黄色突出显示类(公共类 X)。
错过的指令似乎与“静态初始化程序”有关。我对他们很熟悉,而这个特殊的班级没有
挡在里面。它根本没有静态方法。它确实有 4 个公共静态最终整数。它还包含一个枚举。
HTML 输出表明:
作为未涵盖的指令(和方法)。
这个神秘的指令是从哪里来的?我该如何测试它?
我在这个文件中没有任何内部类,我什至无法解释 $1 的来源。
java - 如果放置在声明之前,则静态初始化程序错误
我注意到静态初始化程序中的某些内容可能是 javac 中的错误。我已经构建了一个场景,我可以为变量分配一个值,但不能读回该值。
下面是两个示例,第一个编译正常,第二个在尝试从 tmp 读取值时出错,但由于某种原因,允许将值分配给 tmp。我可以理解它是否既不能读取也不能写入变量,因为 tmp 是在静态初始化程序之后声明的,但是仅其中一个错误对我来说没有意义。
为了进一步强调这一点,这确实编译成功。
java - 如果在引用类之前不调用静态初始化程序,如何注册java类
我有一个由执行文件处理的类实现的接口,比如搜索或其他。
然后我对每种文件类型都有不同的实现:
因此,我有处理器的 Utilizer,它有一个允许注册每个类的方法,如下所示:
到目前为止一切正常。
现在,我提供了我的接口的许多实现。
而且我很想为每个实现类提供一个静态初始化程序,该初始化程序在 Utilizer 中注册自身,在我之前的 TxtProcessor 的情况下,它将是:
问题是这个静态方法永远不会被调用,因为在应用程序的“静态可达”代码中没有对我的 TxtProcessor 类的引用,因为它是通过反射实例化的。所以jvm不调用静态初始化器。
假设我有两个部分:作为 Utilizer 的“通用代码”,另一方面是实现;它必须被认为是动态提供的东西,因此 Utilizer 部分不知道它。
事实上,这个想法正是每个类都会注册自己,而不会触及 Utilizer。
我很难想出一个不将某种形式的实现“知识”放在 Utilizer 端(并且保持简单)的解决方案,只是因为未调用静态初始化程序的问题。如何克服这一点?
java - 什么时候使用初始化器?
我最近遇到了以下一点 java 语法:
显然,这被称为“静态初始化程序”(参见Java 中的静态块),并且“在加载类时执行”。什么时候应该使用静态初始化器?与仅以通常的方式初始化变量相比,它的优点和缺点是什么?
java - Java中的静态初始化器和最终常量
给定以下Java中的简单代码。
在这个最简单的 Java 代码中,static
构造函数应该被调用,当类Demo
被通过main()
方法初始化Demo.serialVersionUID
但它没有被初始化时。
如果这个程序在没有修改的情况下运行,输出将只是1
(消息 -调用静态构造函数。块中指定的static
将不会显示)。
如果我们希望按照初始化程序中指定的方式打印消息,static
那么我们需要修改Demo
类中的声明语句,
要么,
删除final
修饰符,或者,
将原始类型long
更改为其相应的包装类型Long
。
那么,为什么它会这样呢?为什么在static
没有对程序进行指定更改的情况下,它不会在构造函数中显示消息?
c++ - 静态初始化数组联合的结构
我正在尝试为此类编写静态初始化程序:
我已经尝试过这个,还有很多变种,似乎我尝试的任何方法都行不通。
有谁知道如何或是否可以静态初始化它?
java - 来自静态初始化器的静态最终字段初始化
为什么不能使用声明类作为限定符(以静态方式)从相应的静态初始化程序访问静态最终字段?
起初,我认为这是一个 Eclipse 错误:
我还缺乏一些知识,因为静态初始化器不是我的日常工作。但是你瞧,这在没有类限定符的情况下可以正常工作:
为了完成我的测试系列,我在 bash 中试了一下:
导致同样的结果。
这引出了最后一个问题:
从静态初始化块访问静态最终字段时,是否有任何理由禁止类限定符?因为声明类之前没有初始化?
java - 为什么内部类不能使用静态初始化器?
Quoth JLS #8.1.3:
内部类不能声明静态初始化器(§8.7)......
这被证明是这样的:
现在既然 Java 的内部(非静态)类像其他所有类一样由类加载器加载,为什么我们不能为它们设置静态初始化器呢?
这种限制背后的原因是什么?
java - 测试类静态初始化程序的最佳方法是什么?
我有一个具有相当复杂的静态初始化的类。我正在从目录中读取文件,然后解析这些 json 文件,映射到对象,并填写一个列表。你可以想象,可能会出现一些异常,我需要覆盖并测试这些代码分支。问题是这个静态初始化只运行一次/Testcase 文件。我遇到的解决方案:
- 每个行为的新测试用例文件
- 卸载静态类
- 新的JVM
我对这些选项不感兴趣,难道没有更好的选择吗?
java - Java ClassLoader 问题或并发错误?
在 WebLogic 应用程序运行良好几周后,我突然收到一个异常:
之后应用程序完全失效,NoClassDefFoundError
直到应用程序服务器重新启动。
完整的堆栈跟踪显示问题的根源是ConcurrentModificationException
在静态初始化程序中。
具体等效/最小化代码如下:
这是异常的起源:
因此,似乎在应用程序运行时的某个时刻,WebLogic 决定从中重新加载类,package b
但是当静态块运行时,它发现Properties
对象已被修改。
我不知道它是被同时调用还是被多次调用。可能该Properties
对象是应用程序第一次加载时创建的原始实例,并且CommonStuff
类的重新加载试图putAll()
再次调用。
如果我这样做会有所帮助:
我不能盲目地尝试,因为它在一家大公司的生产应用程序中。所以我试图了解我哪里出错了,以及如何在半夜重新加载类时对这些变量进行属性初始化。
有任何想法吗?
这可能是 WebLogic ClassLoader 问题吗?