一尘不染

如何拦截具有标准Java功能(无AspectJ等)的方法调用?

java

我想拦截对某个类MyClass的所有方法调用,以便能够对某些setter调用做出反应。

我尝试使用动态代理,但据我所知,这仅适用于实现某些接口的类。但是MyClass没有这样的接口。

除了实现包装器类之外,还有其他方法可以将所有调用委派给成员(成员是MyClass的实例或使用AOP进行支持)吗?


阅读 262

收藏
2020-09-08

共1个答案

一尘不染

如您所述,您不能使用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"
2020-09-08