2010-07-02 4 views
4

Comme suit: une classe a une méthode appelée sayHello(). Lorsqu'une instance de la classe appelle sayHello(), une méthode d'une autre classe est appelée automatique avant l'appel de sayHello().Comment faire pour qu'une méthode soit appelée passive avant d'appeler une méthode

l'exemple de code peut ressembler à ceci:

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

Résultat de sortie:

Do something before sayHello 
hello 

Il semble qu'il peut être fait en utilisant le modèle de procuration. Mais je veux que ça puisse être plus simple.

Utilisez l'annotation:

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

ensuite mis l'annotation MethodListener sur la méthode sayHello() dans la classe de personne,

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

Lorsque la méthode qui a l'annotation MethodListener être appelée, le La méthode doSomethingBefore() est appelée automatique.

Devrait-il être possible? Si cela est possible, comment l'atteindre?

Répondre

2

Je pense que vous recherchez un framework de programmation orienté aspect tel que AspectJ, JBoss AOP ou Spring AOP.

La décoration de la méthode par personne la méthode du robot se produira lors de la construction de l'instance personne, mais vous aurez besoin d'utiliser une classe d'usine fournie par le conteneur AOP au lieu de nouveau.

3

Vérifiez AspectJ et la structure de programmation orientée aspect. Cela vous permettra de faire quelque chose de similaire.

Vous voyez, pour que cela se produise, votre classe doit être gérée par un conteneur qui instancie vos objets et en fait des proxys. AspectJ a une alternative en branchant un peu de "magie" dans la machine virtuelle.

Questions connexes