我使用ASM和要重寫類似:注入Java方法_before_另一種方法被稱爲
someMethod().targetMethod(args...)
到:
someMethod().injectedMethod(arg).targetMethod(args...)
麻煩的是,我不知道是什麼之前的方法,我只知道目標方法(所以找到someMethod()
並注入後不是一個選項)。
我也有很多版本的目標方法,用不同的參數設置我希望這個工作。
使用ASM我可以很容易地找到目標方法調用,但不幸的是,在這一點上,操作數堆棧是:
[ argN, ..., arg1, instance, ... ]
雖然我可以計算出多遠實例的情況下將是,有沒有字節碼我可以注入將讀取它。我知道你可以使用dup命令做多達4個參數,但我需要一個通用的解決方案。
我可以添加一堆局部變量並將所有內容從堆棧中拷貝出來,重複指向的實例並將所有內容都放回,但這是運行時效率低下,我真的不想要。
我認爲會工作的是,如果我可以跟蹤哪些指令負責將實例指針放在堆棧上,然後我可以在那裏注入我的方法調用,而不是在目標方法調用。然而,我沒有找到任何幫助我做這件事的運氣。
我知道像AspectJ這樣的東西允許這樣做,但是在加載時必須爲很多類執行此操作,而AspectJ太慢了。
任何人都可以指出建立在ASM之上的分析工具,它可以讓我這麼做,或者任何人都可以想到一種更好的方法來在另一種方法之前注入一種方法嗎?
我不明白,你真的需要使用ASM嗎?因爲它好像是在試圖破解現有的Jar。對於那將是更好的反編譯.........如果不是,並且你正在寫一個Java應用程序,你不能使用agregation呢? – fredcrs
我無法反編譯這些類,因爲我只能在類加載時將它作爲javaagent掛鉤。我既不'竊聽現有的jar'或'寫一個Java應用程序';我將字節碼注入類中,因爲它們被加載。 – David
我在學校時曾與[Soot](http://www.sable.mcgill.ca/soot/)合作,並且完全按照這種方式做了一些東西(好的,也許不那麼複雜)。看一看。不幸的是,我不知道它是否構建在ASM之上。想到的另一個選項是AspectJ。 – arin