Как отследить все вызовы методов из класса? - PullRequest
0 голосов
/ 29 июля 2010

Я хочу отследить все вызовы методов из класса Foo.Другой класс, который переопределил бы все методы из Foo, как это ...

@Override
public void blah() {
    System.out.println("blah()");
    super.blah();
}

... сделал бы - но действительно ли мне нужно переопределить их все (более 100 методов)?

Можно ли сделать это более разумным способом, например, с помощью отражения?

РЕДАКТИРОВАТЬ: Чтобы уточнить - Foo - это интерфейс JNI для собственной библиотеки, и мне нужно это, чтобы сохранить всевызовы файла для генерации кода на C, который делает именно то, что я делал с Java.

Ответы [ 4 ]

5 голосов
/ 29 июля 2010

AOP ( Аспектно-ориентированное программирование )

Например, вы можете использовать AJDT , посмотрите его демо

2 голосов
/ 29 июля 2010

Для отладки , если вы используете IBM JVM, вы можете использовать метод trace (может отключить некоторые оптимизации JIT для отслеживаемых методов):

Печать в выходной поток в виде текста:

-Xtrace:iprint=mt,methods{com/my/package/ClassName.methodName}

или в файл в двоичном формате (процесс со встроенным приложением com.ibm.jvm.format.TraceFormat):

-Xtrace:maximal=mt,methods{com/my/package/ClassName.methodName},output=trace.dat

Полная информация в Руководстве по диагностике Java: http://www.ibm.com/developerworks/java/jdk/diagnosis/

1 голос
/ 29 июля 2010

Если вам это нужно только для целей отладки / разработки, а не в финальной системе, вы можете использовать профилирование Eclipse. Профилирование Eclipse позволяет вам определять зонды, которые выполняются в разное время (например, в начале метода), которые позволяют вам выполнять произвольный код Java, имея доступ к таким вещам, как имена методов и значения параметров. Вы можете определить различные фильтры, чтобы выполнять зонды только там, где это необходимо в данный момент. Я не знаю точно, как это работает, но я предполагаю, что файлы классов оснащены инструментами, поэтому влияние времени выполнения должно быть относительно низким.

Если, с другой стороны, вам нужно это в производственном коде, я бы проголосовал за АОП - так, как предлагает Нанда.

1 голос
/ 29 июля 2010

Во-первых, если у вас есть 100 методов в классе, это главный кандидат на рефакторинг.

Затем - вы можете создать прокси (используя CGLIB или javassist) вокруг объекта и всякий раз, когда вызывается метод, сообщать о вызове.

...