在Java中挂钩现有方法

时间:2011-05-03 00:38:15

标签: java hook

我想在Java中挂钩方法System.out.print,并且能够在调用方法的部分之前读取/更改方法中使用的变量,实际上将字符串添加到输出流的任何位置。

在C ++中我只是绕道该函数,或者设置一个int3指令,这样我就可以访问寄存器但是在java中我不知道如何完成类似的事情。

5 个答案:

答案 0 :(得分:7)

您可以重写方法的字节代码,并在此过程中捕获/更改局部变量。这不是微不足道的。请参阅一些注释here

也许您真正想要的是java调试器?您可以使用eclipse将调试器连接到远程进程,添加断点,以及非常轻松地捕获/更改局部变量。

你想解决的真正问题是什么?

答案 1 :(得分:3)

看看这个link

他偷偷地定义了一个静态匿名类,以便System.out指向不同的东西,因此printprintln将路由该对象。

答案 2 :(得分:3)

您可以将System.out(和System.err)重新分配给另一个对象,该对象执行您要对其执行的操作。所述对象通常获取旧的System.out值,以便最终可以输出。

这通常在main()中完成并影响整个JVM。

我们使用它在一个非常特殊的环境中自动包裹130列,其中较长的行被截断。

答案 3 :(得分:0)

答案 4 :(得分:0)

@Nowayz前一段时间我也遇到了同样的问题。 经过一些研究,我开始了解关于AOPAOP,即AspectJ提供了一种通过在之前,之后,周围应用切入点来拦截java API的工具。所以看看它。You can refer my question on stack。它可以帮助你。