java - 使用 Haskell 将函数注入(inject) Java .class 文件

标签 java haskell code-injection bytecode

我使用 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/

相关文章:

java - 如何解决此 eclipse 启动错误?

java - 如何以编程方式打开在后台运行的应用程序

java - Android - style.xml 不起作用

Javassist 注释 MemberValue 不带 Name

java - 需要java登录代码的帮助

haskell - 如何使用 runhaskell 取消隐藏 ghc 库

haskell 错误: "No instance for (Enum [Int])

haskell - 标准的能力

c - 使用 Union 中存在的函数指针执行 shell 代码

C++递归嵌套类型和名称注入(inject)