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

最后输出

完全没毛病

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