【问题标题】:use reflection to modify a method and gain access to its local variables使用反射来修改方法并访问其局部变量
【发布时间】:2013-02-08 16:54:14
【问题描述】:

因为我是not quite sure what's involved with forking gnu.mail.providers,所以我想使用反射来与这个类进行交互。

我认为getMessage 中的算术不正确:

          GroupResponse gr = ns.connection.group(name);
          first = gr.first;
          last = gr.last;
          count = gr.count;
          // Get article
          m = getMessageImpl(msgnum - 1 + first);
          // Cache store
          articleCache.put(key, m);
          return m;

无论如何,我想在 getMessage 方法中访问上面的 GroupResponse 对象。虽然我知道反射可以按照这些方式做事,但我不确定如何从这个特定的方法中获取这个特定的对象。我使用反射来访问某些字段(first、last、count),但这似乎有点不同。

似乎是 GroupResponse 类将所有东西放在一起。

我可以使用反射来编写自定义 getMessage 方法并将其“粘贴”到 NNTPFolder 上吗?我不确定什么是可能的或可取的。

【问题讨论】:

  • 您不能使用反射来检查或修改现有方法的内容。

标签: java api reflection version-control gnu


【解决方案1】:

查看Byteman。使用它,您可以描述一个规则,即无论何时调用受影响类上的方法getMessage(),都会调用您自己的代码。

【讨论】:

  • 是的,这看起来是可能的。然而,所涉及的工作量似乎比分叉 GNU 项目(也许)更大。
  • 我继续分叉了 GNU 项目——或者至少为了我自己的目的修改了源代码。
【解决方案2】:

您不能使用反射来修改方法的内容。您不能使用字节码操作库来修改方法的内容。但是,通过字节码操作,您可以拦截方法调用并重定向到您选择的另一种方法。这大约是你将要获得 afaik 的接近程度。

另一种选择是获取库的源代码,进行一些修改以满足您的需要,然后重新编译。

【讨论】:

  • 使用更高级的工具,他还可以修改类文件,使所有内容保持不变,但为该方法插入不同的字节码,他可以反编译、更改和重新编译。
  • @MarkoTopolnik - 是的,他确实可以,尽管这将接近Black Magic
  • 嘿嘿,那么我们需要在一个严肃的公司项目中大规模地执行黑魔法:)
猜你喜欢
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多