2010-07-02 1 views
4

Так же: класс имеет метод sayHello(). Когда экземпляр класса вызывает sayHello(), метод в другом классе называется автоматическим до вызова sayHello().Как сделать метод называемым пассивным до вызова метода

пример кода может выглядеть так:

public class Robot{ 
    public static void doSomethingBefore(){ 
     System.out.println("Do something before sayHello"); 
    } 

} 


public class Person { 

    public void sayHello(){ 
      System.out.println("hello"); 
    } 

    public static void main(String[] args){ 
      Person p = new Person(); 
      p.sayHello(); 
    } 
} 

Выход Результат:

Do something before sayHello 
hello 

Кажется, это можно сделать с помощью шаблона прокси. Но я хочу, чтобы это было проще.

Использование аннотаций:

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface MethodListener { 
     public String className(); 
     public String methodName(); 
} 

Затем поместите MethodListener аннотацию на методе SayHello() в классе Person,

public class Person { 
    @MethodListener(className="Robot",methodName="doSomethingBefore") 
    public void sayHello(){ 
     System.out.println("hello"); 
    } 

    public static void main(String[] args){ 
     Person p = new Person(); 
     p.sayHello(); 
    } 
} 

Когда метод, который имеет MethodListener аннотацию быть вызвана, метод doSomethingBefore() называется автоматическим.

Возможно ли это? Если это можно сделать, как его достичь?

ответ

2

Я думаю, что вы ищете аспектно-ориентированную структуру программирования, такую ​​как AspectJ, JBoss AOP или Spring AOP.

Украшения метода Person метод робота будет происходить во время строительства экземпляра Person, но вам нужно будет использовать класс фабричного предоставленный АОПОМ контейнер вместо нового.

3

Проверьте AspectJ и аспектно-ориентированную структуру программирования. Это позволит вам сделать что-то подобное.

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

AspectJ имеет альтернативу, подключая некоторую «магию» к VM.

Смежные вопросы