Skip to content

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

测试

为了测试这些新测试,我们将检查当针对故意损坏的类文件运行时,测试是否失败,并显示适当的错误消息。