在Java中挂钩现有方法
我想在Java中挂钩方法System.out.print,并且能够在调用方法部分之前读取/更改方法中使用的变量,实际上将字符串添加到输出流的任何位置。
在C ++中我只是绕道该函数,或者设置一个int3指令,这样我就可以访问寄存器但是在java中我不知道如何完成类似的东西。
您可以重写方法的字节代码,并在此过程中捕获/更改局部变量。 这不是微不足道的。 请看这里的一些注释。
也许你真正想要的是一个java调试器? 您可以使用eclipse将调试器连接到远程进程,添加断点,以及非常轻松地捕获/更改局部变量。
你想要解决的真正问题是什么?
看看这个链接 。
他偷偷地定义了一个静态匿名类,以便System.out指向不同的东西,因此print
和println
将遍历该对象。
您可以将System.out(和System.err)重新分配给另一个对象,该对象执行您要对其执行的操作。 所述对象通常获取旧的System.out值,以便最终可以输出。
这通常在main()中完成并影响整个JVM。
我们使用它在130列的自动包装中进行非常奇特的设置,其中较长的线被截断。
从JDK 1.1开始,添加了System.setOut
和System.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前一段时间我也遇到了同样的问题。 经过一些研究,我开始了解AOP
。 AOP
即AspectJ
提供了一种通过在前后,周围应用切入点来拦截java API的工具。 所以看看吧。 你可以在堆栈上引用我的问题。它可以帮助你。