在Java中挂钩现有方法

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

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

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

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

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

看看这个链接 。

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

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

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

我们使用它在130列的自动包装中进行非常奇特的设置,其中较长的线被截断。

从JDK 1.1开始,添加了System.setOutSystem.setErr方法,以使应用程序能够挂钩流。

链接: http : //docs.oracle.com/javase/7/docs/api/java/lang/System.html#setOut(java.io.PrintStream)

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#setErr(java.io.PrintStream)

@Nowayz前一段时间我也遇到了同样的问题。 经过一些研究,我开始了解AOPAOPAspectJ提供了一种通过在前后,周围应用切入点来拦截java API的工具。 所以看看吧。 你可以在堆栈上引用我的问题。它可以帮助你。