有没有办法在字节码中放置标记?

时间:2015-05-05 15:59:25

标签: java bytecode

我想做的是:我希望有一个预编译的java字节码文件,并且能够在某些地方放置“标记”。后来我想用ASM分析这个文件,用一些代码替换mark。那么,我该如何实现呢?目前我正在尝试通过插入空静态方法的调用来实现它,但我仍然觉得我做错了什么。有更好的方法吗?

P.S。如果更一般,我想要一些预编译的类模板,例如:

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

1 个答案:

答案 0 :(得分:1)

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

因此,您必须选择一个语句来为其指定在模板代码中作为标记的含义,并且使用专用空方法调用的解决方案是此类标记的完美候选。由于它的新含义不依赖于语句的类型,而是依赖于 target 方法,该方法驻留在名称可与所有其他类区分开的类中,因此标记与其他语句之间不存在冲突。 / p>

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

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