2014-10-10 123 views
0

我有两个类, A和B.如何找出何时在java中调用某个对象的方法

A的一个实例创建了一个类B的实例。当对象B的特定函数被调用时,A如何知道?

只要执行对象B的特定函数,但不更改B类的源代码,对象A就需要知道。这应该在运行时完成。

我想可以通过java中的InvocationHandler来完成,但不知道如何去做。

+2

这可能是面向方面编程 – 2014-10-10 21:29:48

+0

或代理的一种情况,但AOP肯定会更优雅 – Leo 2014-10-10 21:30:36

回答

1

基本上,你要装饰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,然后代码仪器等等,但我认为你很好地服务于上述。

1

那B通知A的装饰器呢? http://en.wikipedia.org/wiki/Decorator_pattern

+1

this或AOP,这取决于是否必须在包装中完成除计数递增之外的其他内容。 – 2014-10-10 21:31:06

+0

我想,如果不知道OP的意图背后的原因,你就不能说它是AOP。如果是SoC,那么确定,但可能有更简单的情况。 – lexicore 2014-10-10 21:47:20