如何发现在java中何时调用对象中的方法



我有两个类,例如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

最新更新