1.什麼是動態代理?
動態代理的概念在這裏不做贅述(本人也說不上來),大家都知道動態代理有兩種實現方式,一種是jdk的動態代理,另一種就是我們常用的spring aop所採用的——cglib動態代理,兩種方式都有各自的侷限性....ok跑題了,我們接着往下看
2.枚舉能不能動態代理?
枚舉相信大家都比較熟悉,狀態、類型等等我們都會使用枚舉來代替我們自己的常量類,枚舉的關鍵字是enum而不是class,那麼這是不是意味着它不是一個類呢?其實枚舉底層就是繼承了Enum這個類,我們定義的枚舉中的屬性其實都是static的靜態成員,通過反編譯.class文件我們可以發現,其實他是在static靜態代碼塊中完成了屬性的初始化,由於枚舉類加了final修飾詞,以及構造方法是protect類型的,所以我們不能繼承枚舉類,也不能進行實例化。說到這裏,我們知道枚舉肯定是不能用cglib的動態代理了,因爲cglib是利用hancer獲取代理對象的子類,然而枚舉並沒有辦法被繼承,因此此方法行不通。那麼jdk的動態代理可以嗎?
因爲枚舉居然可以實現接口,所以我們來試試
首先,我建了一個名爲Month的枚舉類,這個枚舉實現了IMonth接口,大家可以看到裏面只有一個方法now,我在now方法裏
做了一件事,就是隨機輸出一月到五月
接下來寫個代理類,代碼很簡單,我這裏就不做解釋了(還是悄悄說一下,method.invoke就是我們之前now方法的調用)
最後我們在枚舉內部新建一個main方法看看:這裏我們獲得了枚舉類的代理對象,然後調用的是代理對象的now方法
最後輸出
完全沒毛病