Подключение существующего метода в Java - PullRequest
13 голосов
/ 03 мая 2011

Я хочу подключить метод System.out.print в Java и иметь возможность читать / изменять переменные, используемые в методе, перед вызовом части метода, которая фактически добавляет строку в любой выходной поток.

В C ++ я бы просто отклонил функцию или установил инструкцию int3, чтобы получить доступ к регистрам, но в Java я не знаю, как сделать что-то подобное.

Ответы [ 5 ]

7 голосов
/ 03 мая 2011

Вы можете переписать байт-код методов, а в процессе перехватить / изменить локальные переменные. Это не тривиально. Смотрите некоторые заметки здесь .

Может быть, вы действительно хотите отладчик Java? Вы можете подключить отладчик к удаленному процессу, добавить точку останова и довольно легко перехватить / изменить локальные переменные, используя eclipse.

Какую реальную проблему вы пытаетесь решить?

3 голосов
/ 03 мая 2011

Вы можете переназначить System.out (и System.err) другому объекту, который делает то, что вы хотите с ним делать.Указанный объект обычно получает старое значение System.out, так что вывод может быть выполнен в конце.

Обычно это делается в main () и влияет на всю JVM.

Мы используем это дляиметь автоматическую упаковку в 130 столбцов в очень специфической обстановке, где более длинные строки усекаются.

3 голосов
/ 03 мая 2011

Посмотрите на эту ссылку .

Он хитро определяет статический анонимный класс, так что System.out указывает на что-то другое, и поэтому print и println будут маршрутизироватьчерез этот объект.

0 голосов
/ 23 июля 2015

@ Nowayz Некоторое время назад у меня тоже была такая же проблема со мной.После некоторых исследований я узнал о AOP.AOP т. Е. AspectJ предоставляет возможность перехвата Java API, применяя точки до, после, вокруг.Так что взгляните на это. Вы можете обратиться к моему вопросу в стеке .Это может помочь вам.

0 голосов
/ 22 сентября 2014

Начиная с 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...