Java 如何在调用方法之前使方法被调用为被动的

Java 如何在调用方法之前使方法被调用为被动的,java,annotations,Java,Annotations,类似这样:一个类有一个名为sayHello()的方法。当类的实例调用sayHello()时,在调用sayHello()之前,另一个类中的方法将被调用为automatic 示例代码可以如下所示: public class Robot{ public static void doSomethingBefore(){ System.out.println("Do something before sayHello"); } } public class Person {

类似这样:一个类有一个名为sayHello()的方法。当类的实例调用sayHello()时,在调用sayHello()之前,另一个类中的方法将被调用为automatic

示例代码可以如下所示:

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()方法

是否可能?如果可以,如何实现它?

检查和面向方面的编程框架。它将允许你做类似的事情

您知道,为了实现这一点,您的类应该由某个容器管理,该容器实例化您的对象并对其进行代理


AspectJ还有一个选择,就是在VM中插入一些“魔法”。

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

在构建Person实例的过程中,将使用Robot方法装饰Person方法,但是您需要使用AOP容器提供的工厂类,而不是new