JEP 235:测试 javac 生成的类文件属性
概述
编写测试以验证 javac
生成的类文件属性的正确性。
目标
创建测试,检查所有类文件属性是否正确生成,即使这些属性在常规的编译和运行场景中并未使用。此外,记录任何现有的此类测试。
动机
类文件属性的测试覆盖率不足。可选属性以及虚拟机不检查的属性无法通过编译输入源、运行它们并验证编译后的程序是否按预期行为来测试。缺乏覆盖率会导致可能只有通过外部工具(如调试器)才能检测到的潜在错误。因此,需要一个特殊的测试套件,它将通过其他方式分析类文件并测试类文件属性的正确性。
描述
测试由 javac
生成文件的常用方法是运行编译后的类,并验证生成的程序是否按预期运行。这种方法不适用于可选的类文件属性,也不适用于未被虚拟机(VM)验证的属性,因此这两类属性必须通过其他方式进行测试。我们将开发一些测试,这些测试将接受 Java 源代码作为输入,编译源代码,读取编译后类文件的类文件属性,并验证它们的正确性。
根据 JVMS,类文件属性被分为三组。
可选属性
这些属性对于 javac
、JVM 或类库的正确运行并不是至关重要的,但它们会被工具使用。测试这些属性是高优先级的,因为它们不会被 JDK 的任何组件所消耗。
SourceFile
SourceDebugExtension
LineNumberTable
LocalVariableTable
LocalVariableTypeTable
Deprecated
JVM 未使用的属性
这些属性不被 JVM 使用,但会被 javac
或类库使用。测试这些属性的优先级为中等。
InnerClasses
(内部类)EnclosingMethod
(外围方法)Synthetic
(合成的)Signature
(签名)RuntimeVisibleAnnotations
(运行时可见注解)RuntimeInvisibleAnnotations
(运行时不可见注解)RuntimeVisibleParameterAnnotations
(运行时可见参数注解)RuntimeInvisibleParameterAnnotations
(运行时不可见参数注解)RuntimeVisibleTypeAnnotations
(运行时可见类型注解)RuntimeInvisibleTypeAnnotations
(运行时不可见类型注解)AnnotationDefault
(注解默认值)MethodParameters
(方法参数)
属性被 JVM 使用
这些属性由 JVM 的字节码验证器检查。无需进一步测试。
ConstantValue
Code
StackMapTable
Exceptions
BootstrapMethods
测试
为了测试这些新测试,我们将检查当针对故意损坏的类文件运行时,测试是否失败,并附有适当的错误消息。