我想拦截对某个类MyClass的所有方法调用,以便能够对某些setter调用做出反应。
我尝试使用动态代理,但据我所知,这仅适用于实现某些接口的类。但是MyClass没有这样的接口。
除了实现包装器类之外,还有其他方法可以将所有调用委派给成员(成员是MyClass的实例或使用AOP进行支持)吗?
如您所述,您不能使用JDK动态代理(无接口),但是使用Spring和CGLIB(Spring附带的JAR),您可以执行以下操作:
public class Foo { public void setBar() { throw new UnsupportedOperationException("should not go here"); } public void redirected() { System.out.println("Yiha"); } } Foo foo = new Foo(); ProxyFactory pf = new ProxyFactory(foo); pf.addAdvice(new MethodInterceptor() { public Object invoke(MethodInvocation mi) throws Throwable { if (mi.getMethod().getName().startsWith("set")) { Method redirect = mi.getThis().getClass().getMethod("redirected"); redirect.invoke(mi.getThis()); } return null; } }); Foo proxy = (Foo) pf.getProxy(); proxy.setBar(); // prints "Yiha"