当前位置: 代码迷 >> java >> 如何在调用方法之前将方法称为被动方法
  详细解决方案

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

热度:98   发布时间:2023-07-17 20:20:47.0

像这样:一个类有一个名为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()被称为自动。

应该可行吗?如果可以做到,如何实现呢?

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

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

AspectJ可以通过将一些“魔术”插入VM中来实现。

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

Robot方法的Person方法的装饰将在构造Person实例期间发生,但是您将需要使用AOP容器提供的工厂类而不是new

  相关解决方案