Вопрос по java – Как использовать Java-методы?

5

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

Например, я хочу использовать Java-программу:

public class TestInstr {

public static void sayHello() {
    System.out.println("Hello !");
}

public static void main(String args[]) {
    sayHello();
    sayHello();
    sayHello();
 }

}

Я хотел бы отобразить что-то вроде этого:

method sayHello has been called
Hello !
method sayHello has been called
Hello !
method sayHello has been called
Hello !

Спасибо за вашу помощь!

Ваш Ответ

5   ответов
1

Единственный вариант, о котором я могу подумать, это реализовать загрузчик классов и заменить исходные классы созданными вами заглушками (Hibernate / JPA делает что-то подобное для отложенной загрузки). Заглушки будут выполнять требуемую операцию, а затем вызывать исходные классы для выполнения работы. Это означало бы тяжелое бремя (размышления не дешевые).

10

такую как Javassist.

Позвольте мне привести пример для одного метода, вы можете распространить его на все методы, используя Javassist или рефлексию:

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("TestInstr");
CtMethod m = cc.getDeclaredMethod("sayHello");
m.insertBefore("{ System.out.println(\"method sayHello has been called\"); }");
cc.writeFile();

Проверьте эту ссылку для деталей:http: //www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial2.html#intr

Благодарность! Я посмотрю на Javassist. kdelemme
4

AspectJ может делать такие вещи; Однако у меня нет опыта работы с ним, поэтому изучение возможностей остается за вами! : D

Я этим не пользовался, но из того, что я слышал, я согласен, что это может быть полезно посмотреть на AspectJ. SJuan76
Также, если вы хотите получить полный контроль, используйте cglib или javassist. Но подумайте об использовании Spring и "around-advice" Xeon
1

В методе, который вы могли бы добавить

public class TestInstr {

public static void sayHello() {
System.out.println("method sayHello has been called");
System.out.println("Hello !");
}

public static void main(String args[]) {
sayHello();
sayHello();
sayHello();
}
}

Вы можете использовать это, чтобы получить текущий метод

public String getCurrentMethodName() {
 StackTraceElement stackTraceElements[] =
         (new Throwable()).getStackTrace();
 return stackTraceElements[1].toString();
}

Я не уверен, что это то, что ты ищешь.

0

то аспектно-ориентированное программирование - это именно то, что вам нужно, независимо от того, AspectJ (статический) или Spring AOP (динамический), оба предоставляют мощные возможности для этого. Однако вам могут понадобиться некоторые библиотеки инструментов на тот случай, если вы захотите сделать больше инструментов, например, отслеживать время выполнения, отслеживать вызовы. Надеюсь, это поможет

Похожие вопросы