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

发布于 2024-12-21 17:56:14 字数 718 浏览 2 评论 0原文

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

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")
}

这确实很有帮助。不幸的是,有很多像这样的 for 看起来我忘记使用 mdc.put()。所以我在想......将是某种方法来检测代码,以便:

  1. 我检测到有一个对 MyObjectType 集合的 for 循环
  2. 我将其作为循环内的第一条指令插入: MDC.put("myobj" , myobj.identify());

如果有一种方法(使用aop、instrumentation、一些java代理?),会有多困难(也许不值得付出努力)。

我从来没有使用过任何java字节码库,只是简单地使用spring aop。

I have a quite large codebase. In many places I have a piece of code like this:

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

MyObjectType is the basic object in my application, and I iterate over many of them very often. I have some log4j set up so that I log info about the MyObjectType instance I am dealing with:

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

This is really helpful. Unfortunately there are tons of for looks like this where I forgot to use the mdc.put(). So I was thinking...would be some way to instrument the code so that:

  1. I detect there is a for looping over a collection of MyObjectType
  2. I insert this as first instruction inside the loop: MDC.put("myobj",
    myobj.identify());

If there is a way (using aop, instrumentation, some java agent?), how difficult would it be (maybe it's not worth the effort).

I have never used any java bytecode library, just spring aop lightly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

濫情▎り 2024-12-28 17:56:14

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

If the iteration method is quite complex and you use it so much, maybe you should move it to a new utility class specifically for handling those functions? That way, you need to write something once and all the calls to the new static method will reuse the same code.

四叶草在未来唯美盛开 2024-12-28 17:56:14

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

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

You can change/add classes at runtime using javassist.
It's practically black magic.

I have also used janino with great success.

故事与诗 2024-12-28 17:56:14

我相信你必须在类加载时执行此操作。我自己也不知道该怎么做。但我们公司使用供应商提供的应用程序以这种方式检测我们的应用程序代码。

对程序员应该注意到的东西进行检测似乎很奇怪(恕我直言)。我想知道为什么不通过像 eclipse 等这样的 IDE 来使用重构,您可以在其中找到某个东西的所有实例,然后添加代码?两者都需要测试,但如果仪器出错,调试问题以解决问题可能会更加困难。

只是我的意见。

I believe you would have to do this at class loading time. I don't know how to do it myself. But our company uses an application by a vendor that instruments our application code this way.

It does seem odd to instrument something that should have been noticed by a programmer (IMHO). I was wondering why not use refactoring through an IDE like eclipse, etc., where you could locate all instances of something and then add the code? Both will require testing, but it will probably be tougher to debug issues to solve problems if you get your instrumentation wrong.

Just my opinion.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文