首页 > 技术文章 > java知识之JVM验证理解(一)——类文件结构篇

caozibiao 2020-11-24 21:21 原文

方法、字段名最大长度是多少?

65535

因为CONSTANT_Utf8_info 表中length 类型为u2,而所有方法、字段都需要引用CONSTANT_Utf8_info 型常量来描述名称,所以最大只能65535

在这里插入图片描述

类的单继承、实现多接口及接口多继承

Class文件格式中,super_class数量仅为1,且除java.lang.Object,所有java的父类都不为0,即都有父类。

而接口有interfaces_count类型和interfaces

在这里插入图片描述

jclasslib验证

测试代码:

public interface InterfaceTest extends InterfaceTest1, InterfaceTest2{
}

interface InterfaceTest1 {
}

interface InterfaceTest2 {
}

jclasslib查看:
在这里插入图片描述

final修饰基本数据类型和String

final修饰的基本数据类型和String,不需要去初始化执行代码的,会在Fields下有ConstantValue的属性。属于编译前期优化,加载前值便初始化了。

测试代码:

public class FinalTest {
    final int i = 10;
    final double d = 10.0;
    final String str = "str";
    final int i2 = new Integer("10");
    final int i3 = new Random().nextInt(10);
    final String str2 = new String("str");
}

jclasslib查看:
在这里插入图片描述

JDK5 新增Signature属性

java范型采用的是擦除法实现,此属性为了避免类型信息被擦除后导致签名混乱而设计。可用于运行期反射获取范型信息。

同样方法中使用LocalVariableTypeTable属性,使用字段的特征签名来完成范型描述。

测试代码:

public class SignatureTest {
    List<String> list1;

    public void test(List<String> list) {
        list = new ArrayList<>();
    }
}

jclasslib验证:
在这里插入图片描述
在这里插入图片描述

实例方法第一个参数为this,类方法则没有

测试代码:

public class ThisTest {
    public void test() {}
    public static void test1(){}
}

jclasslib验证
在这里插入图片描述

同步指令

synchronized修饰方法, ACC_SYNCHRONIZED访问标志为true,执行线程要求先成功持有管程,然后才能执行方法;最后当方法完成(正常或异常),释放管程。

synchronized同步代码块,java虚拟机指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。

测试代码:

public class SynchronizedTest {
    public synchronized void test(){}

    public void test1() {
        synchronized (SynchronizedTest.class) {
            System.out.println(1);
        }
    }
}

在这里插入图片描述

在这里插入图片描述

参考《深入理解java虚拟机》

推荐阅读