我使用 Haskell 编写了一个 Java 字节码解析器,它工作得很好。然而,下一步让我完全难住了。
我的 Haskell 程序需要修改 .class 文件,以便 Java 程序在执行时打印:
“在执行方法之前输入[方法名称]”,并且
“在执行方法后退出 [此处的方法名称]”。
我所知道的是我们需要通过调用 System.out.println
来附加常量池和方法表,但我觉得我仍然遗漏了一些东西。
- 解决这个问题的最佳方法是什么?
- 你怎么知道如何在字节码中调用
System.out.println
? - 如何存储带有方法名称的字符串,以便稍后作为
System.out.println
的参数调用?
最佳答案
嗯,这就是各种字节码工程库给你的。 ASM、BCEL 等。您作业的细节是一个方面,而 AspectJ 正是这样做的。
听起来作业是写一个 Haskell 字节码工程练习,所以你需要自己修改类文件。 @biziclop 上面的建议是正确的。在类文件上做前后对比,记下增量,然后自己从 Haskell 做同样的事情。
[ps: 当然,上面的“捷径” :P 是如果你不想阅读 JVM 规范(如对你的 q 的评论中所述)并弄清楚如何去做,就好像你会如果编写 Java 编译器。您基本上通过使用用于调用的各种字节码之一来调用方法——这里是一个接口(interface)方法调用——在此之前您需要有接收器,例如System 类的静态字段和堆栈上的方法名称。规范中的详细信息。]
关于java - 使用 Haskell 将函数注入(inject) Java .class 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10253474/