我想拦截所有方法调用到某个类MyClass,以便能够对某些setter-invocations做出反应.
我试图使用动态代理,但据我所知,这仅适用于实现某些接口的类.但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"
如果你准备做一些非常丑陋的事情,请看看:
http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/
基本上调试器接口应该允许您像调试器一样附加,从而拦截调用.请记住,我认为这是一个非常糟糕的主意,但你问是否有可能.