是否可以在运行时更改此Java代码以插入一些小代码

时间:2011-12-16 18:38:36

标签: java for-loop bytecode instrumentation

我有一个非常大的代码库。在很多地方我都有一段这样的代码:

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. 我检测到有一个for循环超过MyObjectType
  2. 的集合
  3. 我在循环中插入第一条指令:MDC.put("myobj", myobj.identify());
  4. 如果有办法(使用aop,instrumentation,一些java代理?),它会有多难(也许它不值得付出努力)。

    我从未使用任何java字节码库,只是轻轻地弹跳。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我相信你必须在课堂加载时这样做。我自己不知道怎么做。但是我们公司使用供应商的应用程序,以这种方式检测我们的应用程序代码。

对于应该由程序员(IMHO)注意到的东西来说,这似乎很奇怪。我想知道为什么不通过像eclipse这样的IDE使用重构,在那里你可以找到某些东西的实例,然后添加代码?两者都需要测试,但如果你的仪器出错,调试问题以解决问题可能会更难。

只是我的意见。

答案 2 :(得分:0)

您可以使用javassist在运行时更改/添加类 它实际上是黑魔法。

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