***测试demo git仓库: https://github.com/alwaysInRoad/test-enum-demo.git
测试demo内的代码是从实际项目中抽离出来的,本demo为普通java项目。
说明:
在实际项目中所应用到的场景:在项目运行过程中,根据用户行为动态的改变sql语句中所对应的枚举值,从而动态查询或插入修改。
关键代码说明:
//根据反射获取常量类
Class c2 = Class.forName("com.zr.entity.Constant");
//获取常量类中的所有内部类
Class innerClazz[] = c2.getDeclaredClasses();
//遍历内部内
for (Class class1 : innerClazz) {
//判断类是不是枚举类
if(class1.isEnum()){
//获取内部内的类名,在这里其实就是获取枚举类
String simpleName = class1.getSimpleName();
//反射获取枚举类
Class<Enum> clazz = (Class<Enum>)Class.forName("com.zr.entity.Constant$"+simpleName);
//获取所有枚举实例
Enum[] enumConstants = clazz.getEnumConstants();
//根据方法名获取方法
Method getCode = clazz.getMethod("getDesc");
for (Enum enum1 : enumConstants) {
//得到枚举实例名
String name2 = enum1.name();
//执行枚举方法获得枚举实例对应的值
Object invoke = getCode.invoke(enum1);
System.out.println(name2+":"+invoke.toString());
}
}
}
需要注意的是:
Class<Enum> clazz = (Class<Enum>)Class.forName("com.zr.entity.Constant$"+simpleName);
内部类的反射获取需要加 &+内部类类名
结语:本人所有文章都立志写的简单易懂,戳中问题点。 当然了,简单的同时可能忽略了很多细节与详细,如有不足的地方,还请谅解并指出。