当前位置:  开发笔记 > 编程语言 > 正文

如何使用标准java功能拦截方法调用(没有AspectJ等)?

如何解决《如何使用标准java功能拦截方法调用(没有AspectJ等)?》经验,为你挑选了2个好方法。

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

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

除了实现一个包装类之外,还有其他方法将所有调用委托给一个成员,该成员是MyClass的一个实例,或者是使用AOP的旁边?



1> eljenso..:

如您所知,您不能使用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"



2> Nick Fortesc..:

如果你准备做一些非常丑陋的事情,请看看:

http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/

基本上调试器接口应该允许您像调试器一样附加,从而拦截调用.请记住,我认为这是一个非常糟糕的主意,但你问是否有可能.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有