Как сделать метод вызываемым пассивным, прежде чем вызывать метод - PullRequest
4 голосов
/ 02 июля 2010

Примерно так: в классе есть метод 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 ]

3 голосов
/ 02 июля 2010

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

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

У AspectJ есть альтернатива, подключив немного «магии» к ВМ.

2 голосов
/ 02 июля 2010

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

Украшение метода Person методом Robot произойдет во время создания экземпляра Person,но вам нужно будет использовать фабричный класс, предоставляемый контейнером AOP вместо new .

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