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

Я хочу написать простой агент 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 !

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

 o_nix18 мая 2012 г., 23:01

Ответы на вопрос(5)

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

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

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();
}

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

Решение Вопроса

такую как 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

 kdelemme18 мая 2012 г., 23:14
Благодарность! Я посмотрю на Javassist.

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

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

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

Ваш ответ на вопрос