我有两个类,例如A和B。
A的实例创建了类B的实例。当调用对象B的特定函数时,A怎么会意识到这一点?
无论何时执行对象B中的特定函数,对象A都需要知道,但不更改类B的源代码。这应该在运行时完成。
我想这可以通过java中的InvocationHandler来完成,但不确定也不知道如何完成。
基本上,您必须装饰B
,以便decordatedB.someMethod()
首先通知a
,然后调用d.someMethod()
。
如果B
是一个接口,它很容易,你可以做一些类似的事情
final B b = new BImpl();
final B decoratedB = new B() {
public void someMethod () {
a.someMethodOfBisCalled();
b.someMethod();
}
};
如果B
是一个类,那么您可以使用Proxy(非常粗略的草图):
InvocationHandler bInvocationHandler = new BInvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
// Check this is someMethod
// a.someMethodOfBIsCalled();
// b.someMethod();
}
};
B decoratedB = (B) Proxy.newProxyInstance(B.class.getClassLoader(),
new Class[] { Foo.class }, bInvocationHandler );
还有其他方法,比如前面提到的AOP,然后是代码插入等,但我认为您已经很好地掌握了以上内容。
通知a的B的装饰器怎么样?http://en.wikipedia.org/wiki/Decorator_pattern