Java ASM TraceClassVisitor输出文件出错
当我学习org.objectweb.asm.util.TraceClassVisitor的用法时,我将根据转换结果输出一个文件,并使用ByteArrayInputStream读取classwrite的字节并输出file1。但是,当我使用javap指令查看字节码时,文件将报告错误,并且可以正常查看file1。我需要您的帮助 依赖关系: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
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
用于解析实际类文件。