2012-02-19 31 views
6

我是Javassist的新手,我已經閱讀了一些與之相關的教程。我們可以使用javassist將非原始字段添加到現有類中嗎?

因爲我需要在每個方法輸入或方法出口之前做一些字節碼注入,並從中獲取一些統計信息。

通過網上javassit教程中,我發現,我們可以做出一個新的領域,以現有的類:

CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(CtClass.intType, "z", point); 
point.addField(f); 

但CtField的類型,默認情況下只包含基本類型,我們可以添加一個新的領域其類型是非原始的,例如,ArrayList?

如果我可以將新的ArrayList字段添加到現有的類,因爲類不導入java.util.ArrayList,它會導致編譯錯誤?

回答

6

是的,您可以添加非原始字段。你只需要通過ClassPool獲得該字段的類的句柄。請注意,您將需要你想使用的類的全名:

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList"); 
CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(arrListClazz, "someList", point); 
point.addField(f); 
+0

謝謝,上面的代碼意味着我們的新的ArrayList成員someList添加到點類,但在點類,我們沒」 t導入java.util.ArrayList,這會導致編譯錯誤? – LifeOnCodes 2012-02-19 09:30:24

+0

那麼,你添加***字節碼***表示java.util.ArrayList字段,而不是實際的英文字符串。導入語句只是編譯器指令,不會出現在已編譯的類文件中。順便說一下,爲什麼在ClassPool中搜索類時需要使用完全限定名(FQN)。 – Perception 2012-02-19 09:53:22

+0

非常感謝,我明白了。我想我應該花一些時間研究字節碼。還有一個問題,希望你能幫助我,someList memeber有可能是一個泛型類型,比如ArrayList someList? – LifeOnCodes 2012-02-19 09:59:33

相關問題