我想通过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之间添加。我可以通过比较两个版本的字节码来获得相应的位置。我认为应该有一种更聪明,更简单的方式。