如何在调用方法之前将方法称为被动方法

时间:2010-07-02 07:20:24

标签: java annotations

像这样:一个类有一个名为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注释放在Person类的方法sayHello()中,

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 个答案:

答案 0 :(得分:3)

检查AspectJ和面向方面的编程框架。它可以让你做类似的事情。

你知道,为了实现这一点,你应该通过一些容器来管理你的类,它实例化你的对象并代理它们。

AspectJ可以通过在虚拟机中插入一些“魔法”来替代。

答案 1 :(得分:2)

我认为您正在寻找面向方面的编程框架,例如AspectJ,JBoss AOP或Spring AOP。

在构造Person实例期间,将通过Robot方法对Person方法进行修饰,但是您需要使用AOP容器提供的工厂类而不是 new