ASM TraceClassVisitor输出文件错误

问题描述

当我了解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;","").visitEnd()
    traceClassWriter.visitField(Opcodes.ACC_PUBLIC+ Opcodes.ACC_FINAL + Opcodes.ACC_STATIC,"classversion","I",50).visitEnd()
    traceClassWriter.visitMethod(
        Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT,"getTraceInfo","()Ljava/lang/String;",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_example / 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;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)