JAVA中是否有办法在我的类的每个方法上调用回调函数而不必显式执行调用?
我不想做
public void foo()
{
//some code
callBackFunction()
}
我想做
public void foo()
{
//some code
}
然后该类识别出它必须调用callBackFunction()
答案 0 :(得分:8)
面向方面编程是以半全局方式执行此操作的最简单方法。直接使用AspectJ或使用像{Spring supports aspects这样的IOC容器。
基本上你可以做的是定义“切入点”,这是一种表达源代码中做某些其他动作的方法。您可以在现有方法实现之前,之后或代替现有方法实现执行该操作(如调用callbackFunction())。
其中还有很多其他有用的功能,但是如果过度使用它会导致很难调试代码。
答案 1 :(得分:8)
您可以使用反射在运行时检查类并使用所谓的“动态代理”对象包装其所有方法。查看官方Java documentation on reflection的示例(搜索“DebugProxy”页面,它实际上实现了进入和离开每个方法的回调)。
答案 2 :(得分:1)
你可以使用AOP - AspectJ,但要注意学习曲线陡峭
答案 3 :(得分:1)
其他几个人已经提到过AOP和AspectJ。如果您对使用AspectJ不感兴趣,但仍需要一些AOP功能,Spring可以帮助您实现它。
为了使这项工作更好,您应该对接口进行编码,因此Spring可以轻松地使用Java代理注入AOP行为。接下来会发生一个接口的替代实现,一个将调用委托给“真正的”实现,并在方法调用之前和/或之后添加一些额外的工作。
坦率地说,只需手写一个新的实现,就可以在没有Proxies或Spring的情况下做到这一点,例如
public void foo() {
callbackFunction();
this.delegate.foo();
}
其中this.delegate是“真正的”impl,但您的客户最终会调用上述foo()
方法。
...
IFooBar y = new FooBar(); // implements IFooBar
IFooBar x = new FooBarProxy(y); // also implements IFooBar, but with the callback and delegate
x.foo(); // calls y.foo() implicitly
...