2011-12-16 52 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

如果迭代方法非常复杂,并且您使用它太多了,也许您应该将其移至专门用于处理这些函数的新实用程序类中?这样,你需要写一次,所有对新静态方法的调用都会重用相同的代码。

相关问题