我正在尝试做的事情:我想拥有一个预编译的Java字节码文件,并且能够在某些地方放置“标记”。稍后,我想使用ASM分析此文件,并用一些代码替换mark。那么,我该如何实现呢?目前,我正在尝试通过插入空静态方法的调用来做到这一点,但我仍然感觉自己在做错事情。有一个更好的方法吗?

附言如果更通用,我想拥有一些预编译的类模板,例如:

public class Main {
public static void Main(String... args){
    System.out.println("Program starts!");
    //I want to insert code here
    System.out.println("Bye!");
}}

最佳答案

好吧,没有Java语句没有预定义的含义,也许,除了空语句;不会创建您可以在字节码中找到的代码之外。有注释,但是它们只能用于标记另一个代码片段,而不能在代码中创建独立的语句。

因此,您必须选择一条语句来为其指定在模板代码中成为标记的含义,并且使用专用空方法的调用解决方案是此类标记的理想选择。由于它的新含义不依赖于语句的种类,而是取决于目标方法(该方法位于与其他所有类可区分的名称的类中),因此标记与其他语句之间没有冲突。

但是,您应该考虑到,与为任何非平凡的语言实现编译器时所生成的代码相比,框架类代码相当琐碎。在大多数情况下,将生成的代码修补到现有代码中的逻辑将超过仅生成完整的类文件的复杂性。

如果确实有很多不变的代码,则应考虑将它们放入自己的类中,并使用或扩展它们来生成类。这简化了代码生成并避免了代码重复(与在手工编写的代码中使用这些技术的原因相同)。

10-06 08:49