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

像这样:一个类有一个名为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,JBoss AOP或Spring AOP。

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

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

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

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