首页>Program>source

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

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

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

最新回答
  • 2021-1-12
    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"
    

  • 2021-1-12
    2 #

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

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

    基本上,调试器接口应允许您像调试器一样进行附加,因此可以拦截调用.请记住,我认为这是一个 really

  • 2021-1-12
    3 #

    Java没有用于方法拦截的实际语言功能(不确定是否有任何静态语言)

    我有点像尼克的使用调试器接口的想法,这只是意思.

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

    注意:AOP库只是使这种情况自动发生。

  • 2021-1-12
    4 #

    我为此目的开发了一个小型框架。 您可以在以下网址进行检查:http://code.google.com/p/java-interceptor/(使用svn进行检出)。

  • 2021-1-12
    5 #

    某些Java专家可能对此并不满意.在完全避免使用原始类型和setter方面取得了一些成功.我的Class看起来像这样:

    class Employee extends SmartPojo {
        public SmartString name;
        public SmartInt age;
    }
    

    您会注意到两件事:1.一切都是公开的. 2.没有构造函数。

    神奇之处在于SmartPojo,它会搜索实现" Smart"接口并对其进行初始化的任何字段.由于这不是原始的(也不是最终的类),因此我可以在一个地方为模型中任何地方的所有字段添加set()和get()方法.因此,不再有设置者/获取者的浪费,添加通知(也在单个位置)等非常简单。

    是的,这不再是POJO了,在大多数情况下它也不是Bean,但我发现这些古老的想法对我的限制超过了他们的帮助. yMMV。

  • r:在ggplot2中将构面标签更改为数学公式
  • java:哪些Swing组件方法是线程安全的?