Java ASM TraceClassVisitor输出文件出错

Java ASM TraceClassVisitor输出文件出错,java,bytecode,Java,Bytecode,当我学习org.objectweb.asm.util.TraceClassVisitor的用法时,我将根据转换结果输出一个文件,并使用ByteArrayInputStream读取classwrite的字节并输出file1。但是,当我使用javap指令查看字节码时,文件将报告错误,并且可以正常查看file1。我需要您的帮助 依赖关系: dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) im

当我学习org.objectweb.asm.util.TraceClassVisitor的用法时,我将根据转换结果输出一个文件,并使用ByteArrayInputStream读取classwrite的字节并输出file1。但是,当我使用javap指令查看字节码时,文件将报告错误,并且可以正常查看file1。我需要您的帮助

依赖关系:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'org.ow2.asm:asm:7.0'
    implementation 'org.ow2.asm:asm-commons:7.0'
    implementation 'org.ow2.asm:asm-analysis:7.0'
    implementation 'org.ow2.asm:asm-util:7.0'
    implementation 'org.ow2.asm:asm-tree:7.0' }
代码是这样的

fun main() {
    val classWriter = ClassWriter(0)
    // 使用 TraceClassVisitor
    val traceClassWriter =
        TraceClassVisitor(classWriter, PrintWriter("asm_example/files/TraceClassVisitorDemo.class"))
    traceClassWriter.visit(
        Opcodes.V1_7,
        Opcodes.ACC_PUBLIC + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT,
        "part2/TraceClassVisitorDemo",
        null,
        "java/lang/Object",
        null
    )
    traceClassWriter.visitSource("TraceClassVisitorDemo.class", null)
    traceClassWriter.visitField(Opcodes.ACC_PUBLIC+ Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "className", "Ljava/lang/String;", null, "").visitEnd()
    traceClassWriter.visitField(Opcodes.ACC_PUBLIC+ Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "classVersion", "I", null, 50).visitEnd()
    traceClassWriter.visitMethod(
        Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT,
        "getTraceInfo",
        "()Ljava/lang/String;",
        null,
        null
    ).visitEnd()
    traceClassWriter.visitEnd()

    ClassOutputUtil.byte2File("asm_example/files/TraceClassVisitorDemo1.class", classWriter.toByteArray())
}
当我使用javap指令查看字节码时,文件将报告错误,并且可以正常查看file1

javap-v TraceClassVisitorDemo.class

错误: 读取asm_example/files/TraceClassVisitorDemo.class的常量池时出错: unexpected tag at #1: 101
当我将PrintWriter(“asm_示例/files/TraceClassVisitorDemo.class”)更改为PrintWriter(System.out)时,输出信息如下:

// class version 51.0 (51)
// access flags 0x601
public abstract interface com.andoter.asm_example.part2/TraceClassVisitorDemo {

  // compiled from: TraceClassVisitorDemo.class

  // access flags 0x19
  public final static Ljava/lang/String; className = ""

  // access flags 0x19
  public final static I classVersion = 50

  // access flags 0x401
  public abstract getTraceInfo()Ljava/lang/String;
}

正如您在将其定向到
System.out
时所看到的那样,
TraceClassVisitor
生成一个人类可读的表示,而不是类文件。由于您也知道
toByteArray()
生成实际的类文件,所以不清楚为什么您认为
TraceClassVisitor
的目的是创建另一个冗余类文件。TraceClassVisitor中的一个参数是printer,所以我想尝试输出文件的形式,但是我很困惑,为什么javap不能识别它当你将打印机指向一个文件而不是
System.out
,它仍然是你在控制台上看到的相同的文本内容。任何文本编辑器都可以显示这一点。工具
javap
用于解析真实的类文件。正如您在将其定向到
System.out
时所看到的那样,
TraceClassVisitor
生成一个人类可读的表示,而不是类文件。由于您也知道
toByteArray()
生成实际的类文件,所以不清楚为什么您认为
TraceClassVisitor
的目的是创建另一个冗余类文件。TraceClassVisitor中的一个参数是printer,所以我想尝试输出文件的形式,但是我很困惑,为什么javap不能识别它当你将打印机指向一个文件而不是
System.out
,它仍然是你在控制台上看到的相同的文本内容。任何文本编辑器都可以显示这一点。工具
javap
用于解析实际类文件。