跳到主要内容

JEP 235:测试 javac 生成的类文件属性

QWen Max 中英对照

概述

编写测试以验证 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

测试

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