gpt4 book ai didi

java - 类文件中变量的初始值存储在哪里

转载 作者:行者123 更新时间:2023-12-02 06:59:10 25 4
gpt4 key购买 nike

我仍在尝试学习java类文件格式,并且我了解常量变量值存储在ConstantValue属性下,但是我不明白非常量字段值存储在类文件中的位置。比如

public Robot robot = new Robot();

我查看了 oracle 类文件规范,但找不到任何这样的属性。

最佳答案

用于存储初始值的唯一属性是ConstantValue。然而,这仅用于静态变量。在 Java 编译代码中,它仅用于静态最终变量,尽管它可以用于手写字节码中的任何静态变量。当然,该值必须是恒定的。

对于您发布的示例,您拥有 Java 中所谓的初始化程序。这些在类文件中没有等效项。相反,Java 编译器将在每次父类(super class)构造函数调用返回后粘贴此代码。请注意,这意味着如果您可以在此之前查看它们,例如通过在父类(super class)构造函数中调用虚拟方法,它们将尚未初始化。

这是一个例子。

public class initializers {

static final float f = 4;
static final int i = int.class.hashCode();
static int i2 = 4;

public final Object x = null;
public Object x2 = null;


public initializers() {}
public initializers(int x) {this();}
public initializers(float x) {}
}

编译和反汇编类结果

.version 49 0
.class super public initializers
.super java/lang/Object

.field static final f F = 4.0F
.field static final i I
.field static i2 I
.field public final x Ljava/lang/Object;
.field public x2 Ljava/lang/Object;

.method public <init> : ()V
.limit stack 2
.limit locals 1
aload_0
invokespecial java/lang/Object <init> ()V
aload_0
aconst_null
putfield initializers x Ljava/lang/Object;
aload_0
aconst_null
putfield initializers x2 Ljava/lang/Object;
return
.end method

.method public <init> : (I)V
.limit stack 1
.limit locals 2
aload_0
invokespecial initializers <init> ()V
return
.end method

.method public <init> : (F)V
.limit stack 2
.limit locals 2
aload_0
invokespecial java/lang/Object <init> ()V
aload_0
aconst_null
putfield initializers x Ljava/lang/Object;
aload_0
aconst_null
putfield initializers x2 Ljava/lang/Object;
return
.end method

.method static <clinit> : ()V
.limit stack 1
.limit locals 0
getstatic java/lang/Integer TYPE Ljava/lang/Class;
invokevirtual java/lang/Object hashCode ()I
putstatic initializers i I
iconst_4
putstatic initializers i2 I
return
.end method

如您所见,f 是唯一使用 ConstantValue 属性的属性。 i 没有,因为它不是常量表达式,而 i2 没有,因为它不是最终的。初始化 ii2 的代码被放置在静态初始化程序(“类构造函数”)中。初始化 xx2 的代码粘贴在两个父类(super class)构造函数调用之后,但没有粘贴在第二个构造函数中,后者仅调用同一类中的构造函数。

关于java - 类文件中变量的初始值存储在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com