2011-05-03 125 views
13

现有的方法,我想钩Java中的方法,并是System.out.print具有读/更改方法的部分之前的方法中使用的变量的能力被称为实际添加字符串无论输出流是什么。挂钩在Java中

在C++中,我只想绕路功能,或者设置一个INT指令,所以我可以访问寄存器,但在Java中,我不知道如何完成类似的东西。

回答

7

你可以重写的方法的字节码,并在这个过程中捕捉/改变局部变量。这不是微不足道的。请参阅一些注意事项here

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

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

+0

是的,这正是我正在寻找的东西,我想我将不得不阅读Java字节码的工作原理。感谢您的有用答案。 – Nowayz 2011-05-03 00:51:36

+0

我正在尝试将所有System.out.print的调用记录到文件中。但是我运行我的类的应用程序并不是我开发的应用程序,实际上修改现有的代码会有些困难,所以我需要某种方法在VM规模上挂接该方法以便进行日志记录。 – Nowayz 2011-05-03 01:04:23

+0

您可以使用http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html方面在每个System.out.println周围添加一个点,或者将System.out简单地设置为其他内容http://blogs.sun.com/nickstephen/entry/java_redirecting_system_out_and – sbridges 2011-05-03 01:09:04

3

看看这个link

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

+0

基本上我正在寻找一种改变整个VM实例的方法的效果,这可能吗? – Nowayz 2011-05-03 00:47:39

+0

我不知道如何做到这一点,但我认为为System.out制作自定义类加载程序会执行此操作。只是一个想法。 – Mike 2011-05-03 00:51:55

2

您可以重新分配的System.out(和System.err)到另一个对象,做你想用它做什么。所述对象通常获取旧的System.out值,以便最后可以输出。

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

我们利用这个有130列自动包装在更长的线路被截断一个非常奇特的设置。

0

@Nowayz前一段时间我也有同样的问题我。 经过一番研究,我才知道关于AOPAOPAspectJ提供了一个工具,通过在切入点之前,之后,周围应用切入点来拦截java API。所以看看它。 You can refer my question on stack。他可能会帮助你。