java - 我想知道如何编写初始化静态类变量的Java字节码
问题描述
我现在正在研究 Java 字节码。我想编写 Java 字节码以在 Java 源代码中制作 Test.java,如下所示。我想在一个类中声明和初始化静态变量。
测试.java
public class Test {
public static int a=1;
public Test() {
}
public static void main(String[] var0) {
}
}
命令结果:javap -c 测试
public class Test {
public static int a;
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: return
**static {};
Code:
0: iconst_1
1: putstatic #2 // Field a:I
4: return**
}
我正在写的代码
测试.j
.class public Test
.super java/lang/Object
.field public static a I
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 32
.limit locals 32
return
.end method
我使用 jasmin-2.4 将 java 字节码转换为 .class。我想知道如何在 static {} 中编写 java 字节码;代码:0:iconst_1 1:putstatic #2 //字段a:I 4:返回
对不起,奇怪的英语句子。谢谢你让我知道。
解决方案
为了完整起见,静态字段的初始化器行为不是编译时常量,在 Java 语言规范中描述为类初始化的第 9 步:
接下来,按文本顺序执行类的类变量初始化程序和静态初始化程序,或者接口的字段初始化程序,就好像它们是一个单独的块一样。
此块javap
打印为static {}
,隐藏您感兴趣的实现细节。
对于这个细节,我们必须参考 Java 虚拟机规范,§2.9.2.,类初始化方法:
如果满足以下所有条件,则方法是类或接口初始化方法:
我省略了有关在旧 JVM 中未强制执行哪些属性的详细信息,因为您不应该利用这些缺陷。类初始值设定项应始终具有上面指定的属性。
一般而言,Java 虚拟机规范是您在处理 Java 字节码时应该随时准备的文档。
推荐阅读
- javascript - Vue / JS 指令事件 Llisterner 抽象
- gams-math - 如何在 GAMS Studio 中设置许可证?
- javascript - 检测“MediaElementAudioSource 是否由于 http 的 CORS 访问限制而输出零...”
- javascript - 使用 Vue.js 和 Laravel 将复选框设置为选中状态
- keras - 如何屏蔽具有 RepeatVector() 层的 LSTM 自动编码器中的输入?
- python-3.x - 如何解决从空列表错误中弹出的问题?
- node.js - 无法加载资源:net::ERR_CONNECTION_RESET 和后端错误:非法参数:未定义,字符串
- c# - 从 vb.net 运行的异步任务
- react-native - react native 有没有办法在特定视图中禁用 rtl 或保持相同的外观
- asp.net - 如何安全地使用 httppost 发送 ID