跳到主要内容

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

测试

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