java枚舉究竟能不能動態代理?

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方法

最後輸出

完全沒毛病

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章