问题描述
像这样:一个类有一个名为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()被称为自动。
应该可行吗?如果可以做到,如何实现呢?
1楼
检查和面向方面的编程框架。 它可以让你做类似的事情。
你会看到,为了实现这一点,你应该通过一些容器来管理你的类,它实例化你的对象并代理它们。
AspectJ可以通过将一些“魔术”插入VM中来实现。
2楼
我认为您正在寻找面向方面的编程框架,如AspectJ,JBoss AOP或Spring AOP。
Robot方法的Person方法的装饰将在构造Person实例期间发生,但是您将需要使用AOP容器提供的工厂类而不是new 。