当前情况&上下文
对于学校作业,我们必须编写自己的编程语言。目前,我一直在尝试进行方法调用。
我可以成功地创建一个方法,但在我试图调用它的时候,程序中断了。
测试代码
我用来测试的代码是
testMethod();
method testMethod () {
print("Test");
}
这会生成以下代码
- 解压缩类
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// AS YOU CAN SEE IT CAN NOT DECOMPILE MAIN METHOD
//
public class test {
public static void main(String[] param0) {
// $FF: Couldn't be decompiled
}
public void testMethod() {
System.out.println("Test");
}
}
- Java字节码
.class public test
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 99
.limit locals 99
invokevirtual void/testMethod()V
return
.end method
.method public testMethod()V
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Test"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
.limit stack 10
.limit locals 10
return
.end method
我试过什么
我尝试用以下Java字节码调用该方法:
(test是我正在测试的类的名称(
- 调用虚拟void/testMethod((V
- invokevirtualtestMethod((V
- invokevirtualtest/testMethod((V
- invokevirtualtest/valid/testMethod((V
我感谢的任何帮助
正如@apaingin在评论中所解释的,您正试图调用一个实例方法,因此需要一个对象来调用它,但您没有提供对象。在调用testMethod
之前,您需要创建一个test
实例并将其推送到堆栈,或者将testMethod
标记为静态并通过invokestatic
调用它,在这种情况下这可能更容易。
话虽如此,我也建议使用Krakatau汇编程序,而不是Jasmin。Krakatau使用了Jasmin语法的一种稍微修改过的形式,它更简单,也不容易出错。特别是,在Krakatau中,类名、方法名和方法描述符用空格分隔,消除了在调用方法时需要将斜杠放在哪里的许多困惑。Krakatau还有其他优势,比如完全支持字节码格式,包括Java 14功能,以及一个往返反汇编程序,它可以极大地帮助解决与字节码相关的问题。