1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
僅僅添加一個(gè)轉(zhuǎn)換器不會(huì)導(dǎo)致重新加載已經(jīng)加載的類。默認(rèn)情況下,您的轉(zhuǎn)換器只會(huì)看到新加載的類,因此您在退出時(shí)看到一些類的原因是這些類以前沒有使用過,而是專門為關(guān)閉過程加載的。
要重新轉(zhuǎn)換您首先必須addTransformer(yourTransformer, true)
用于注冊(cè)的類,然后使用您要轉(zhuǎn)換retransformClasses
的類調(diào)用。注意getAllLoadedClasses的存在和getInitiatedClasses(ClassLoader)
作為附加說明,我強(qiáng)烈反對(duì)將 Java 代理嵌入為源代碼字符串的方法,需要將它們寫入臨時(shí)文件,調(diào)用編譯器并最終創(chuàng)建 jar 文件。您可以輕松地將代理類集成到您的普通源代碼中。然后,要生成僅包含代理類的 jar 文件,您只需將現(xiàn)有.class
文件從應(yīng)用程序的代碼庫(kù)復(fù)制到代理 jar。對(duì)于簡(jiǎn)單的情況,您可以同時(shí)使您的應(yīng)用程序 jar 文件成為有效的代理 jar 文件,然后直接使用它,而無需任何額外的復(fù)制步驟。
此外,請(qǐng)記住, aClassFileTransformer
應(yīng)該始終返回null
它不會(huì)更改的所有類。返回原始類文件字節(jié)在語義上是相同的,但是調(diào)用方需要付出額外的努力才能發(fā)現(xiàn)您沒有更改它。對(duì)于將為每個(gè)加載的類調(diào)用的代碼,但通常只對(duì)少數(shù)感興趣(或者只想打印信息而不更改任何內(nèi)容),這樣的性能問題很重要。
添加回答
舉報(bào)