Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
挂接Java中的现有方法_Java_Hook - Fatal编程技术网

挂接Java中的现有方法

挂接Java中的现有方法,java,hook,Java,Hook,我想用Java钩住方法System.out.print,并能够在调用方法中实际将字符串添加到输出流中的部分之前读取/更改方法中使用的变量 在C++中,我只需绕过函数,或者设置一个It3指令,这样我就可以访问寄存器,但是在java中,我不知道如何实现类似的操作。 他偷偷地定义了一个静态匿名类,以便System.out指向不同的对象,因此print和println将通过该对象进行路由。您可以重写方法的字节码,并在此过程中捕获/更改局部变量。这不是小事。请看一些注释 也许你真正想要的是java调试器?

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

<>在C++中,我只需绕过函数,或者设置一个It3指令,这样我就可以访问寄存器,但是在java中,我不知道如何实现类似的操作。
他偷偷地定义了一个静态匿名类,以便System.out指向不同的对象,因此
print
println
将通过该对象进行路由。

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

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


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

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

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


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

自JDK 1.1以来,添加了
系统.setOut
系统.setErr
方法,以使应用程序能够钩住流

链接:


@Nowayz之前的一段时间,我也有同样的问题。
经过一些研究,我了解了
AOP
AOP
AspectJ
提供了通过在前后应用切入点来拦截java API的工具。那就来看看吧。它可能会对您有所帮助。

基本上,我正在寻找一种可以改变整个VM实例的方法的效果,这可能吗?我不确定如何做到这一点,但我认为为System.out制作自定义类装入器可以做到这一点。只是一个想法。是的,这正是我想要的,我想我必须阅读Java字节码是如何工作的。谢谢你的帮助。我正在尝试将System.out.print的所有调用记录到一个文件中。但是我运行我的类的应用程序不是我开发的应用程序,实际修改现有代码有点困难,因此我需要某种方法在VM规模上钩住该方法,以便进行日志记录。您可以使用aspects在每个System.out.println周围添加一个切入点,或者简单地将System.out设置为其他内容,覆盖的System.out会影响对该API的所有调用吗?即使是其他类等,只要它们在同一个VM上?是的,它将影响整个jvm对System.out的所有调用