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方法
最后输出
完全没毛病