问题描述
当我了解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 (将#修改为@)