JEP 235: Test Class-File Attributes Generated by javac | 测试 javac 生成的类文件属性
摘要
编写测试以验证 javac
生成的类文件属性的正确性。
目标
创建测试,检查所有类文件属性是否被正确生成,即使这些属性在常规的编译和运行场景中没有使用。此外,记录任何现有的此类测试。
动机
类文件属性的测试覆盖范围不足。对于编译输入源文件、运行它们并验证编译的程序是否按预期工作的方法无法测试可选属性和虚拟机未检查的属性。覆盖不足会导致可能仅能通过调试器等外部工具检测到的错误。需要一个特殊的测试套件,通过其他手段分析类文件并测试类文件属性的正确性。
描述
测试由 javac
生成的文件的常见方法是运行编译后的类并验证生成的程序是否按预期工作。但对于可选的类文件属性和虚拟机未验证的属性,这种方法无法使用,所以这两种类型的属性必须通过其他方式进行测试。将开发一些测试,接受 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
测试
为了测试这些新测试,我们将检查当针对故意损坏的类文件运行时,测试是否失败,并显示适当的错误消息。