0

我正在尝试学习 Java 中的动态代理。

我知道它们是如何工作的,但我找不到解决我的问题的方法:给定一个接口及其实现方法 a()、b() 和 c() 嵌套在另一个中(假设 a() 调用 b( ) 调用 c()),我想代理我的对象来记录对方法的每次调用。

所以我对我的 InvocationHandler 进行了编码,例如 invoke() 方法在执行之前打印了一条日志行。

但是当我调用 proxy.a() 时,只记录了方法 a() 的调用,而不是整个方法链。

我错过了什么?代理的目标是否必须是代理本身?

4

2 回答 2

2

好吧,对象本身并不知道它正在被代理,所以当 a() 调用 b() 时,它将是一个正常的“内部对象”调用。

如果代理的目标是代理本身,您将有一个循环。

如果确实需要,解决此问题的一种方法是将委托引入目标对象,并使用代理或将其自身设置为委托。奇怪,但可能有效。不过要注意循环。

于 2012-02-23T11:29:27.550 回答
2

这是因为,当您从您的测试代码调用proxy.a()时,您的最终a()方法不是调用proxy.b(),而是直接调用 self 实例b()

作为一种解决方法,您可以重载每个方法,并将其传递给委托实例。假设类名 MyClass 和接口名 MyInterface:

void a() {
   //to keep the non-proxy working, the default method have to pass the 
   //self intance
   a(this);
}
void a(MyInterface target) {
   target.b(target);
}

void b() {
   b(this);
}
void b(MyInterface target) {
   target.c(target);
}
void c() {
   c(this);
}
void c(MyInterface target) {
   //do whatever
}

然后,从您的测试代码中,您将能够调用proxy.a(proxy),并获得预期的结果。

于 2012-02-23T11:32:12.267 回答