Java: трассировка выполнения динамически загруженного класса - PullRequest
2 голосов
/ 21 июня 2010

В основном я пытаюсь динамически загрузить класс с аннотированными методами, запустить основной метод класса, а затем вызвать некоторый код при вызове аннотированных методов.

Пример:

public myclass {
public static void myMethod1(){
mymethod2();
}

@trace
public static void myMethod2(){
   ... some code here ...
}
public static void main(String[] args) {
mymethod1();
}
}

Программа traceHandler.java должна иметь возможность загружать любой класс, запускать его основной метод и печатать «Метод X вызван», когда вызывается аннотированный метод X.я выполнил динамическую загрузку, но не могу найти способ «разместить списки» на аннотированных методах.

Решения, которые я нашел, включают использование AOP или прокси, заставляя целевые классы реализовать некоторыеинтерфейсы ( 1 ), есть ли другой способ сделать все это динамически, не вдаваясь в детали целевого класса?

Ответы [ 3 ]

2 голосов
/ 21 июня 2010

Вы можете использовать AspectJ для отслеживания вызовов методов.Создайте pointcuts для целевых методов, аннотированных вашей аннотацией @trace, и создайте точки соединения, чтобы отслеживать выполнение этих методов.Затем вы можете написать совет, в котором вы можете записывать вызовы методов в sysout или файл журнала.См. это сообщение в блоге для примера.

1 голос
/ 21 июня 2010

Использование динамического прокси-сервера - это, насколько мне известно, самый простой способ «обогатить» поведение класса аннотациями, не прибегая к инструментальным средствам или сторонним средам.

InvocationHandler может быть полностью общим, но для этого не требуется знание целевого класса. Пример в вас ссылка имеет

private final Login realLogin;

но это вполне можно заменить на

private final Object realLogin;

потому что вызов происходит с return method.invoke(realLogin, args);.

Обратите внимание, что вы не сможете использовать эту технику с методом static, как в вашем вопросе. Эта техника действительно работает только для методов экземпляра, и если объект реализует интерфейс.

0 голосов
/ 21 июня 2010

Создание динамического прокси-сервера не требует подробных сведений о целевом классе, поскольку вся необходимая информация передается в вызове invoke ().

Check http://download.oracle.com/javase/1.3/docs/guide/reflection/proxy.htmlЭто не так страшно, как кажется.

Я немного озадачен проблемой целевых классов, не реализующих интерфейсы.Если вы собираетесь загружать их динамически, они должны как-то вписываться в общую картину, и я всегда предполагаю, что есть некоторый интерфейс, чтобы иметь возможность манипулировать ими.

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