首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何拦截具有标准java特性(无AspectJ等)的方法调用?

如何拦截具有标准java特性(无AspectJ等)的方法调用?
EN

Stack Overflow用户
提问于 2009-02-23 08:43:33
回答 7查看 47.9K关注 0票数 23

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

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

除了实现包装类之外,是否还有其他方法可以将所有调用委托给一个成员,该成员是MyClass的实例或使用面向方面编程?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-02-23 10:11:59

正如您所注意到的,您不能使用JDK动态代理(无接口),但是使用Spring和CGLIB (Spring附带的JAR),您可以执行以下操作:

代码语言:javascript
复制
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"
票数 30
EN

Stack Overflow用户

发布于 2009-02-23 08:47:22

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

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

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

票数 14
EN

Stack Overflow用户

发布于 2009-02-23 08:55:51

Java没有任何用于方法拦截的实际语言特性(不确定任何静态语言都有)

我有点喜欢Nick使用调试器接口的想法,这太糟糕了。

我认为您需要的简短答案是:不,在Java中,没有一种方法可以在不使用代理或包装器实际替换类的情况下拦截方法调用。

注意: AOP库会自动实现这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/576918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档