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