我有两个类, A和B.如何找出何时在java中调用某个对象的方法
A的一个实例创建了一个类B的实例。当对象B的特定函数被调用时,A如何知道?
只要执行对象B的特定函数,但不更改B类的源代码,对象A就需要知道。这应该在运行时完成。
我想可以通过java中的InvocationHandler来完成,但不知道如何去做。
我有两个类, A和B.如何找出何时在java中调用某个对象的方法
A的一个实例创建了一个类B的实例。当对象B的特定函数被调用时,A如何知道?
只要执行对象B的特定函数,但不更改B类的源代码,对象A就需要知道。这应该在运行时完成。
我想可以通过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,然后代码仪器等等,但我认为你很好地服务于上述。
那B通知A的装饰器呢? http://en.wikipedia.org/wiki/Decorator_pattern
this或AOP,这取决于是否必须在包装中完成除计数递增之外的其他内容。 – 2014-10-10 21:31:06
我想,如果不知道OP的意图背后的原因,你就不能说它是AOP。如果是SoC,那么确定,但可能有更简单的情况。 – lexicore 2014-10-10 21:47:20
这可能是面向方面编程 – 2014-10-10 21:29:48
或代理的一种情况,但AOP肯定会更优雅 – Leo 2014-10-10 21:30:36