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

    通用:计算执行后具有某些参数的比较和副本的数量

    2个选项

    注意:我总是有一个.java文件开头

    1)编辑Java文件


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

    2)使用ASM字节码工程


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

    我的问题

    什么是最好/最干净的方法?有更好的方法吗?

有帮助吗?

解决方案

如果您使用Java路由,则不想使用正则表达式-您需要一个真正的Java解析器。这样可能会影响您的决定。请注意,Oracle JVM在实现Java编译器的内部私有类中包括一个,因此,如果您不想这样做,则实际上不必自己编写一个。但是,解码Oracle AST也不是5分钟的任务。而且,当然,如果那很重要,则使用它不是可移植的。

如果您使用ASM路由,则字节码最初将更易于分析,因为语义要简单得多。就解决方案的净时间而言,分析的简便性是否比不熟悉还难确定。最后,就生成的代码而言,都不是“更好”的。

看生成的Java源代码并“知道”所见即所得与进行类文件的原始转储以进行调试等“相识”显然很简单,但是由于Java lanaguage使您已经舒适。一旦花了一些时间来挖通字节码,这也将变得很舒服。只是一个问题,您是否值得花时间首先到达那里。

其他提示

通常,这取决于您对这两种选择的适应程度以及性能方面的关键程度。字节码操作将更快,更简单,但是您必须了解字节码如何工作以及如何使用ASM框架。

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

以下是用于拦截变量访问的简化代码: 通用标签

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

如果您需要有关ASM的教程,我偶然发现了该用户编写的教程单击此处

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top