问题标签 [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 投票
3 回答
2478 浏览

java - Java 静态初始化器可以调用静态方法吗?

我可以从 Java 中的静态初始化程序调用静态方法吗?以下内容是否有效并保证按照 Java 规范工作?

让我想知道的是,我可能期望bar在里面有空generateValue()。我知道静态初始化块的顺序很重要,但我没有听说过静态方法声明的顺序很重要。但是在执行静态初始化块之前,静态方法是否可用?

0 投票
3 回答
1971 浏览

rust - 使用宏初始化非复制元素的大数组

我正在尝试使用相同的初始化程序初始化大量元素。64 个元素只是一个例子——我想让它至少 16k。不幸的是一个简单的

不会工作,因为AllocatedMemory结构没有实现Copy

所以我尝试了宏无济于事:

错误信息是

有没有办法在不剪切和粘贴每个初始化程序的情况下初始化这个数组?

0 投票
0 回答
37 浏览

java - Java静态初始化器中的类名

在代码中

javac 说

但是如果我删除“测试”。从作业中的“Test.var1”开始,它可以毫无怨言地编译。为什么 javac 会这样?

0 投票
2 回答
211 浏览

java - 如何在 Java 静态块中创建本地类?

来自 Java 文档:

局部类是在一个中定义的类,它是一组在平衡大括号之间的零个或多个语句。您通常会发现在方法体中定义的本地类。

此外,Local 类是一种特殊的内部类,需要从外部类对象实例化:

与实例方法和变量一样,内部类与其封闭类的实例相关联

但是静态块是在类加载期间调用的,在创建对象实例之前。

那么,如何在静态初始化块中创建和实例化本地类呢?

例如:

答案改编自本地类的 dup:根据 JLS 项目 # 15.9.2

如果 C 是本地类(第 14.3 节),则令 O 为 C 的最内层词法封闭类。令 n 为整数,使得 O 是出现类实例创建表达式的类的第 n 个词法封闭类. 然后:

如果 C 出现在静态上下文中,则 i 没有立即封闭的实例。

否则,如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。

否则,i 的直接封闭实例是 this 的第 n 个词法封闭实例(第 8.1.3 节)。

0 投票
2 回答
554 浏览

java - 如何捕获 ExceptionInInitializerError?

我想安装某种全局处理程序来捕获ExceptionInInitializerError在加载某个类时可能从任何静态块中抛出的任何内容。目前它将堆栈跟踪转储到 stderr 并退出应用程序。我想使用我的日志框架记录堆栈跟踪,然后退出应用程序。是否可以?

0 投票
2 回答
9987 浏览

oop - Kotlin - 是否可以在类中的 init 块之前初始化伴随对象?

是否可以在 Kotlin 类中companion object的块之前初始化一个?init如果是这样,怎么做?如果没有,有没有办法完成同样的事情。

我有以下情况,

并且调用printAllStatics会导致空指针异常。

0 投票
2 回答
1730 浏览

java - 加载、链接和初始化 - 什么时候加载一个类?

我对类加载的理解是,一个类在第一次需要时被加载(用一种非常简单的方式说)。使用 -verbose:class 和 Iterators 类的修改版本运行以下示例,该版本在调用其 clinit 时会打印一条消息,但我观察到了一些我无法真正解释的东西:

(清理后的)输出如下:

为什么在调用 clinit 之前加载 Iterators$1?它只在 clinit 中定义,不是吗?

这导致以下字节码:

更让我困惑的是,我还有一个示例(太复杂,无法在此处发布),其中与上面主要代码相同的代码行导致以下输出:

这实际上也是我对简单测试程序的期望。

我试图在这里找到答案https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html,但这并没有真正帮助。

  • 有时首先执行 clinit 而有时首先加载匿名类可能是什么原因?
  • 当JVM调用类的clinit时,有没有办法跟踪?类似于 -verbose:class 或 -XX:+TraceClassLoading 等的东西?
0 投票
0 回答
34 浏览

java - 静态块和初始化函数之间的执行顺序

静态块和静态初始化函数之间定义的执行顺序是什么?这是他们在类定义中的顺序吗?

例如:

在我的系统上打印 1,2,3。这是由 Java 保证的吗?我见过类似的问题,但没有一个包含这个答案的问题。

0 投票
1 回答
913 浏览

java - 注释类型和静态块中的初始化

我一直在尝试在类加载注释类型时做一些逻辑。自然地,我想到了静态块。

但不幸的是,这是不允许的,Eclipse 中的编译错误是:

我的注释声明是:

我正在尝试做的是构建一个验证器,该验证器通过一个又一个字段并检查任何非法值。

现在,这个框架完全不知道什么被认为是“非法值”,即由这个框架的任何潜在用户来创建他们自己的规则,从而创建任意数量的自定义注释并将其映射到一个回调方法,该方法知道如何来验证它。

@Validate是在验证框架中用于将注释标记为验证器的自定义元注释(类似于 CDI 的@Qualifier)。框架所做的只是,当Validator.validate(obj)被调用以扫描所有字段时,如果它的任何注释具有元注释@Validate,则查找其对应的回调方法并使用作为参数传递的该字段来调用它。回调对找到的任何非法值抛出异常。

我正在尝试找到一种通用的方法来进行注释回调映射,因此最终用户不必手动进行映射,而是自定义注释的作者。所以这就是我最终尝试的。

知道如何克服这个限制吗?

0 投票
2 回答
603 浏览

java - 为什么静态初始化程序允许在 Java 中重新初始化静态变量?

我正在研究 Java 中的静态初始化程序。我通过以下源代码获得:

我的问题是为什么编译器没有抱怨在静态初始化块中重新分配了变量的值count。我知道 Java 允许前向引用,只要遵循声明前读取规则(即在声明之前不应读取任何标识符),这适用于所有初始化程序,如果没有,则引用(或标识符)必须位于左侧 -手边的任务。我还知道,如果在一个类中编写多个静态初始化表达式和静态字段初始化块,那么它们的执行顺序是连续的。 1count = 1

根据我的执行流程应该是:加载类,然后按顺序执行所有静态初始化程序(表达式和块),因此count将初始化为值5,然后执行默认构造函数调用 super () 并将实例变量初始化alive为默认值。但是为什么它没有抛出静态变量count已重新初始化的错误(因为它不是前向引用的情况),而是给出了输出1。这是否意味着我们可以通过静态初始化块重新初始化静态变量?