【问题标题】:Best choice? Edit bytecode (asm) or edit java file before compiling最好的选择?在编译之前编辑字节码 (asm) 或编辑 java 文件
【发布时间】:2012-02-21 23:17:41
【问题描述】:

目标

  • 检测变量之间的比较和副本的位置
  • 在发生操作的行附近注入代码
  • 代码的目的:每次运行类时都会增加一个计数器

通用:计算使用某些参数执行后进行的比较和复制的数量

2 个选项

注意:我总是以 .java 文件开头

1) 编辑java文件


查找与正则表达式的比较并在行附近注入代码片段 然后编译类(我的应用使用JavaCompiler)

2)使用 ASM 字节码工程


还检测我要跟踪的事件的位置并将片段注入字节码 然后使用(已经编译但修改过的)类

我的问题

最好/最干净的方法是什么?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: java compilation bytecode java-bytecode-asm java-compiler-api


    【解决方案1】:

    如果您选择 Java 路线,您不想使用正则表达式——您需要一个真正的 Java 解析器。所以这可能会影响你的决定。请注意,Oracle JVM 包含一个,作为实现 java 编译器的内部私有类的一部分,因此如果您不想编写,实际上不必自己编写。但解码 Oracle AST 也不是 5 分钟的任务。当然,如果这很重要,那么使用它是不可移植的。

    如果您采用 ASM 路线,字节码最初会更容易分析,因为语义要简单得多。就解决方案的净时间而言,分析的简单性是否超过了不熟悉性是未知的。最后,就生成的代码而言,两者都不是“更好”的。

    仅查看生成的 java 源代码并“知道”所见即所得与为调试等进行类文件的原始转储相比显然很简单,但所有这些明显的简单性都是因为您已经熟悉 Java 语言。一旦你花一些时间挖掘字节码,它也会变得舒服。只是一个问题,您是否值得花时间首先到达那里。

    【讨论】:

      【解决方案2】:

      通常,这完全取决于您对任一选项的舒适程度以及性能方面的重要性。字节码操作会更快,也更简单,但您必须了解字节码的工作原理以及如何使用 ASM 框架。

      拦截变量访问可能是 ASM 最简单的用例之一。您可以在这篇 AOSD'07 论文中找到一些更复杂的场景。

      这里是拦截变量访问的简化代码:

      ClassReader cr = ...;
      ClassWriter cw = ...;
      cr.accept(new MethodVisitor(cw) {
        public void visitVarInsn(int opcode, int var) {
          if(opcode == ALOAD) {  // loading Object var
            ... insert method call
          } 
        }
      });
      

      【讨论】:

      • 如果您对字节码感到满意,那么简单的事情使用 ASM 会简单得多,复杂的事情可能会很棘手,但仍然可以管理。
      【解决方案3】:

      如果是我,我可能会使用 ASM 选项。

      如果您需要有关 ASM 的教程,我偶然发现了这个用户编写的教程 click here

      【讨论】:

      • 您能否也说说您为什么更喜欢 ASM 选项?
      • @tgoossens 使用起来似乎更理想。主要是因为它会做这项工作,而不是每次运行时都编辑 java 文件。
      • 我有偏见,但本教程可能展示了使用 ASM 的最糟糕的方法之一。 :)
      • @EugeneKuleshov 我只是想我会提到它,因为我遇到了它。我已经收藏了一段时间了,从来没有真正阅读过。
      • @Laszki 当人们推荐他们没有真正使用过的东西时,我觉得很奇怪......该教程使用内存中的树 API 来做它不需要的事情。您确实需要树 API 来进行一些复杂的转换或复杂的字节码分析。
      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多