2011-12-16 95 views
2

我有一個相當大的代碼庫。在很多地方,我有一段這樣的代碼:是否有可能在運行時更改此java代碼以插入一些小代碼

for (MyObjectType myobj : myList) { 
    //...do something with myobj 
} 

MyObjectType是在我的應用程序的基本對象,我遍歷其中不乏非常頻繁。我有一些log4j設置,以便我記錄有關我正在處理的MyObjectType實例的信息:

for (MyObjectType myobj : myList) { 
    MDC.put("myobj", myobj.identify()); 
    ... 
    logger.error("this message contains info about myobj") 
} 

這真的很有幫助。不幸的是,在我忘記使用mdc.put()的時候,看起來像是這樣的。所以我想......會是某種方式儀器代碼,以便:

  1. 我發現有一個用於遍歷的MyObjectType
  2. 收集我插入此作爲循環中第一個指令:MDC.put("myobj", myobj.identify());

如果有一種方法(使用aop,instrumentation,一些Java代理?),它會有多難(可能不值得)。

我從來沒有使用任何java字節碼庫,只是輕輕一跳。

+0

Coccinelle不支持Java(還),這太遺憾了......否則它一直是這項工作的理想工具! – fge 2011-12-16 18:41:00

回答

0

您可以在運行時使用javassist更改/添加類。
這幾乎是黑魔法。

我也用janino取得了很大的成功。

0

我相信你不得不在課堂上課的時候這樣做。我不知道如何自己做。但是,我們公司使用供應商提供的應用程序來處理我們的應用程序代碼。

儀器看起來很奇怪,應該被程序員(恕我直言)注意到。我想知道爲什麼不使用通過像Eclipse等IDE的重構,在那裏你可以找到所有的東西,然後添加代碼?兩者都需要測試,但如果您的測試儀器出錯,調試問題解決問題可能會更加困難。

只是我的意見。

1

如果迭代方法非常複雜,並且您使用它太多了,也許您應該將其移至專門用於處理這些函數的新實用程序類中?這樣,你需要寫一次,所有對新靜態方法的調用都會重用相同的代碼。

相關問題