SourceFile属性用于记录生成这个Class文件的源码文件名称。为了方便在编译器和动态生成的Class中加入供程序员使用的自定义内容,在JDK 5时,新增了SourceDebugExtension属性用于存储额外的代码调试信息。
6.ConstantValue属性
作用是通知虚拟机自动为静态变量赋值。
7.InnerClasses属性
用于记录内部类与宿主类之间的关联。
8.Deprecated及Synthetic属性
Deprecated及Synthetic都属于标志类型的布尔属性,只存在有和没有的区别没有属性值。Deprecated属性用来表示某个类、字段或方法
Synthetic属性代表此字段或者方法并不是由Java源码直接产生的,而是由编译器自己添加的
9.StackMapTable属性
StackMapTable属性在JDK 6增加到Class文件规范之中,它是一个相当复杂的变长属性,位于Code 属性的属性表中。这个属性会在虚拟机类加载的字节码验证阶段被新类型检查验证器(Ty p e Checker)使用目的在于代替以前比较消耗性能的基于数据流分析的 类型推导验证器。
10.Signature属性
Signature属性在JDK 5增加到Class文件规范之中,它是一个可选的定长属性,可以出现于类、字段 表和方法表结构的属性表中。之所以要专门使用这样一个属性去记录泛型类 型,是因为Java语言的泛型采用的是擦除法实现的伪泛型,字节码(Code属性)中所有的泛型信息编 译(类型变量、参数化类型)在编译之后都通通被擦除掉。使用擦除法的好处是实现简单(主要修改 Javac编译器,虚拟机内部只做了很少的改动)、非常容易实现Backport,运行期也能够节省一些类型 所占的内存空间。但坏处是运行期就无法像C#等有真泛型支持的语言那样,将泛型类型与用户定义的 普通类型同等对待,例如运行期做反射时无法获得泛型信息。Signat ure属性就是为了弥补这个缺陷而增设的,现在Java的反射API能够获取的泛型类型,最终的数据来源也是这个属性。
11.BootsrapMethods属性
BootstrapMethods属性在JDK 7时增加到Class文件规范之中,它是一个复杂的变长属性,位于类文件的属性表中。这个属性用于保存invokedy namic指令引用的引导方法限定符。
12.MethodParameters属性
MethodParameters是在JDK 8时新加入到Class文件格式中的,它是一个用在方法表中的变长属性。MethodParameters的作用是记录方法的各个形参名称和信息。
13.模块化相关属性
DK 9的一个重量级功能是Java的模块化功能,因为模块描述文件(module-info.java)最终是要编 译成一个独立的Class文件来存储的,所以,Class文件格式也扩展了Module、ModulePackages和 ModuleM ainClass三个属性用于支持Java模块化相关功能。
14.运行时注解相关属性
jdk8之后提供了6种属性,比如RuntimeVisibleAnnotations主要是记录了类、字段或方法的声明上记录运行时可见注解,当我们使用反射API来获取类、字段或方法上的注解时,返回值就是通过这个属性来取得的。
虚拟机类加载机制Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。与那些在编译时需 要进行连接的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成 的,这种策略让Java语言进行提前编译会面临额外的困难,也会让类加载时稍微增加一些性能开销, 但是却为Java应用提供了极高的扩展性和灵活性,Java天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。
类加载的时机一个类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期会经历加载、验证、准备、解析、使用和卸载七个阶段
在什么情况下需要开始类加载过程的第一阶段“加载”,这点可以交给虚拟机的具体实现来自由把握。
遇到了以下六种情况必须立即对类进行“初始化”
1.遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类型没有进行过初始化,则需要先触发其初始化阶段。
2.使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需要先触发其初始化。
3.当初始化类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
4.当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会初始化这个主类。