2017-03-16 42 views
0

我只想澄清一些與Javassist有關的事情。Javassist澄清(導入和插入)

1. ClassPool.importPackage方法是否爲該類物理地添加行號?例如,如果這是我的代碼:

public class Test { 
    public static void main(String[] args){ 
     System.out.println("Message!");// Line 3 
    } 
} 

而我要導入「java.util。*;」包,該打印語句現在是否在第4行?

2.有沒有辦法在方法行號而不是類行號處添加代碼? CtMethod.insertAt()需要一個類行號。

如果有人對此有所瞭解,我會非常感謝澄清,因爲文檔非常模糊,似乎沒有人看到需要提出這個問題。

回答

0

除非您告訴Javassist,否則不會更改行號。如果您使用Javassist導入類,則這不會更改類文件,而只能作爲Javassist的一個提示,在哪些包中應該查找未限定的類名。在字節碼中,類名始終是完全限定的。

此外,Javassist在方法級別不支持insertAt。然而,您可以通過遍歷方法的指令並找到第一個行號來模擬此行爲。只需爲此號碼添加一個偏移量即可。

+0

對不起,如果這聽起來很愚蠢,但我可以有一個迭代方法指令並找到第一個行號的例子嗎? – CoalCoding

+0

從'CtMethod',你可以得到它的'MethodInfo'實例。它甚至定義了一個便於使用的方法'getLineNumber',它可以滿足您的需求:https://jboss-javassist.github.io/javassist/html/javassist/bytecode/MethodInfo.html#getLineNumber-int-請注意,它可能會返回' - 1「,如果在insertAt方法不起作用的地方沒有定義該值。 –