2011-05-03 13 views
13

Quiero conectar el método System.out.print en Java y tener la capacidad de leer/cambiar las variables utilizadas en el método antes de que se llame a la parte del método que realmente agrega la cadena a cualquiera que sea el flujo de salida.Enlazando un método existente en Java

En C++ simplemente desviaba la función, o establecía una instrucción int3 para poder acceder a los registros, pero en java no tengo idea de cómo lograr algo similar.

Respuesta

7

Puede volver a escribir el código de bytes de los métodos, y en el proceso capturar/cambiar las variables locales. No es trivial. Vea algunas notas here.

Tal vez lo que realmente quieres es un depurador de Java? Puede conectar un depurador a un proceso remoto, agregar un punto de interrupción y capturar/cambiar las variables locales con bastante facilidad utilizando eclipse.

¿Cuál es el problema real que está tratando de resolver?

+0

Sí, esto es justo lo que estaba buscando, supongo que tendré que leer sobre cómo funciona el bytecode de Java. Gracias por la respuesta útil. – Nowayz

+0

Estoy intentando registrar todas las llamadas de System.out.print a un archivo. Pero la aplicación en la que estoy ejecutando mi clase no es una que haya desarrollado y sería un poco difícil modificar realmente el código existente, así que necesito alguna forma de enganchar el método en una escala de VM con el fin de iniciar sesión . – Nowayz

+0

Puede usar los aspectos http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html para agregar un punto de corte alrededor de cada System.out.println, o simplemente establecer System.out en otra cosa http://blogs.sun.com/nickstephen/entry/java_redirecting_system_out_and – sbridges

3

Echa un vistazo a este link.

Defiende a escondidas una clase anónima estática para que System.out apunte a algo diferente, y por lo tanto print y println encaminarán a través de ese objeto.

+0

Básicamente estoy buscando un efecto que cambie el método para toda la instancia de VM, ¿es esto posible? – Nowayz

+0

No estoy seguro de cómo hacer esto, pero creo que crear un Custom Class Loader para System.out lo haría. Solo una idea. – Mike

2

Puede reasignar System.out (y System.err) a otro objeto que hace lo que quiere hacer con él. Dicho objeto normalmente obtiene el antiguo valor de System.out para que la salida se pueda realizar al final.

Esto generalmente se realiza en main() e influye en toda la JVM.

Utilizamos esto para tener un ajuste automático en 130 columnas en un entorno muy peculiar donde las líneas más largas se truncan.

0

@Nowayz algún tiempo antes de que yo también tenía el mismo problema conmigo. Después de algunas investigaciones llegué a saber acerca de AOP. AOP es decir AspectJ proporciona una facilidad para interceptar las API de Java aplicando los puntos de corte antes, después, alrededor. Así que échale un vistazo. You can refer my question on stack .it puede ayudarlo.

Cuestiones relacionadas