首頁>Program>source

我想拦截對某个類MyClass的所有方法呼叫,以便能够對某些setter呼叫做出反應。

我尝試使用動態代理,但是据我所知,這仅適用於實現某些介面的類.但是MyClass没有這樣的介面。

除了實現包裝器類之外,還有其他方法可以將所有呼叫委派给成員(成員是MyClass的例項或使用AOP进行支援)吗?

最新回復
  • 1月前
    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"
    

  • 1月前
    2 #

    如果您準備做一些非常丑陋的事情,請查看:

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

    基本上,除錯器介面應允许您像除錯器一樣进行附加,因此可以拦截呼叫.請記住,我认為這是一个 really

  • 1月前
    3 #

    Java没有用於方法拦截的實際語言功能(不確定是否有任何靜態語言)

    我有點像尼克的使用除錯器介面的想法,這只是意思.

    我认為您需要的簡短答案是:在没有使用代理或包裝程式實際替換類的情况下,没有办法拦截Java中的方法呼叫。

    註意:AOP庫只是使這種情况自動發生。

  • 1月前
    4 #

    我為此目的開發了一个小型框架。 您可以在以下網址进行檢查:http://code.google.com/p/java-interceptor/(使用svn进行檢出)。

  • 1月前
    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元件方法是執行緒安全的?