java - 如何在调用方法之前使方法成为被动方法

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

是否应该可以?如果可以,如何实现?

最佳答案

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

你看,为了实现这一点,你的类应该由某个容器管理,该容器实例化你的对象并成为它们的代理。

AspectJ 通过将一些“魔法”插入 VM 来提供替代方案。

关于java - 如何在调用方法之前使方法成为被动方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163908/

相关文章:

java - 添加不同位置的圆圈

ios - 快速删除 MKMap View 上的 "My Location"注释

java - 'nested'注释的Spring AOP切入点

android - 没有使用maven将注释处理(生成的)源编译成apk

java - 使用 Java Applet 实现键盘监听器

java - 在 JTree 中单击关键节点时从属性文件中检索值

java - 如果 Google Cloud Dataflow 中不存在,则使用 TextIO.Write 创建新存储桶

java - 在数组中保存元素的算法保持顺序

java - 编译器如何处理注释?

Java注释将字段设置为静态实例?