Kotlin Code using org.objectweb.asm library
import org.objectweb.asm.ClassWriter
import org.objectweb.asm.Opcodes.*
fun main(args: Array<String>) {
val classWriter = ClassWriter(ClassWriter.COMPUTE_MAXS)
classWriter.visit(
V1_8,
ACC_PUBLIC,
"com/github/patrick/learnasm/build/HelloWorld",
null,
"java/lang/Object",
null
)
val methodVisitor = classWriter.visitMethod(
ACC_PUBLIC + ACC_STATIC,
"main",
"([Ljava/lang/String;)V",
null,
null
)
methodVisitor.visitFieldInsn(
GETSTATIC,
"java/lang/System",
"out",
"Ljava/io/PrintStream;"
)
methodVisitor.visitLdcInsn(
"Hello World!"
)
methodVisitor.visitMethodInsn(
INVOKEVIRTUAL,
"java/io/PrintStream",
"println",
"(Ljava/lang/String;)V",
false
)
methodVisitor.visitInsn(
RETURN
)
methodVisitor.visitMaxs(
0,
0
)
methodVisitor.visitEnd()
val bytes = classWriter.toByteArray()
val clazz = defineClass(
"com.github.patrick.learnasm.build.HelloWorld",
bytes,
0,
bytes.count()
)
clazz.getDeclaredMethod("main", Array<String>::class.java).invoke(null, null)
}
I am trying to learn asm, and I'm curious whether creating a method with named parameter is possible.
For example in this case, the created class has no parameter name (defaults to var0 in decompiler), and I wish I could save parameter names like "args". Would it be possible?
MethodVisitor.visitParametersor something similar? - Johannes Kuhn