如何通过给定的源代码列号

时间:2016-07-01 03:39:41

标签: java bytecode

我想通过ASM在一行代码中间检测一些代码,插入位置由源代码列号给出。例如,有一行代码:

if(logger!=null && logger.getName()!=null)

我需要在第12列的位置处的两个条件检查之间插入一些代码,该位置在a!=null&&之间。该行的相应字节码为:

1 ALOAD 0
2 GETFIELD Main$Thread1.this$0 : LMain;
3 INVOKESTATIC Main.access$0 (LMain;)Ljava/util/logging/Logger;
4 IFNULL L1
5 ALOAD 0
6 GETFIELD Main$Thread1.this$0 : LMain;
7 INVOKESTATIC Main.access$0 (LMain;)Ljava/util/logging/Logger;
8 INVOKEVIRTUAL java/util/logging/Logger.getName ()Ljava/lang/String;
9 IFNULL L1

我的问题是,是否有任何编程方式找出源代码列号12对应于字节码中第4行和第5行之间的位置?是否有任何ASM API支持此类功能?

我目前的解决方案是生成一个新的源文件,其中原始行在第12列被破坏,因此有两行新的字节码,例如

L2
LINENUMBER 41 L2
在原始行4和5之间添加

。我可以通过比较两个版本的字节码来获得相应的位置。我认为应该有一种更聪明,更简单的方式。

0 个答案:

没有答案