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