关于反射获取枚举上的信息,javaSE的jdk相关API里面并没有提供方法,直接获取也只能获取到enum类上的注解,上网搜了半天,中文没搜到解决方法结果,感觉太坑爹了,于是记录且分享如下:
一、前言----引出问题
在前面的一篇博文(
反射+枚举+freemarker,自动生成实体类,自动建表建索引(一)之生成实体类,枚举详解)中,讲到关于自动生成实体类的方法中,用枚举来当配置文件,这个枚举类有些地方还可以再改进,那些枚举实例可以用注解来实现!这样配置起来较为方便,也反射获取数据时也比较方便。
原先的枚举类:
/**
* 原来的举类
* @author Lufeng
*
*/
@EntityConfig(entityName = "Character", tableName = "zh_character")
public enum EntityCharacter {
account (String.class),
name (String.class, LENGTH, 12),
profession (String.class, INDEX, true),
sex (String.class),
level (String.class),
test (String.class, LENGTH, 6, INDEX, true, NULLABLE, true, DEFAULTS, "test"),
testnew (int.class, LENGTH, 6, INDEX, true, DEFAULTS, 100),
;
public EntityConfigData conf;
private EntityCharacter(Class<?> clazz, Object...params) {
conf = new EntityConfigData(clazz, params);
}
}
改进的枚举类:
/**
* 改进的的枚举类
* @author Lufeng
*
*/
@EntityConfig(entityName = "Character", tableName = "zh_character")
public enum EntityCharacter {
@FieldConfig(String.class)
account,
@FieldConfig(value = String.class, length = 12)
name,
@FieldConfig(value = String.class, index = true)
profession,
@FieldConfig(String.class)
sex,
@FieldConfig(int.class)
level,
@FieldConfig(value = long.class, index = true, nullable = true, defaults = "test")
test,
@FieldConfig(value = String.class, index = true, length = 6)
testnew,
;
}
附-用到的自定义的FieldConfig注解:
package com.test.annotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Rentention;
import java.lang.annotation.RententionPolicy;
import java.lang.annotation.Target;
/**
* 用于配置字段的注解
* @author Lufeng
*
*/
@Rentention(RententionPolicy.RUNTIME)
@Target({ElementType.FIELD})// 注意!这里一定要用Field,这样注解才可以加载enum实例中!!!
public @interface FieldConfig {
// 表中字段约束信息(类型,长度,索引,是否为空,默认值)
Class<?> value(); // 类型
int length() default 0; // 长度
boolean index() default false; // 索引
boolean nullable() default false; // 是否为空
String defaults() default ""; // 默认值
}
二、解决问题----获取枚举上的注解
要解析这个配置枚举类,才能获取相关消息,生成实体类,比如获取字段的类型,是否为索引,默认值等信息,关于反射获取枚举上的信息,javaSE的jdk相关API里面并没有提供方法,直接获取也只能获取到enum类上的注解,上网搜了半天,中文没搜到解决方法结果,感觉太坑爹了,于是google搜了英文,一下就找到解决方法了,在stackoverflow上有答案,于是分享如下,思路是先反射获取枚举实例如account所在class,然后获取枚举class上声明的该枚举field字段,然后用字段获取其上的Annotation注解,这样在调用注解的相关方法即可。。(enumm.getClass().getField(enumName).getAnnotation(FieldConfig.class); )具体代码如下:
/**
* 根据枚举实例字段enumm获得其上FieldConfig注解的对应name值
* @param enumm
* @param name
* @return
* @throws Exception
* @author Lufeng
*
*/
public static Object getFieldInfo(Object enumm, String name) throws Exception{
// 获取@FieldConfig注解
String enumName = ((Enum<?>)enumm).name(); // 先获取枚举名
Annotation annotation = enumm.getClass().getField(enumName).getAnnotation(FieldConfig.class); //在获取注解
// 在获取想要的方法
Method method = FieldConfig.class.getMethod(name);
// 反射调用方法获取相关注解值
Object result = method.invoke(annotation);
return result;
}
三、总结
其实搞技术写代码的,遇到问题要多自己思考思考,解决方案也许多想想就想到了,先别想着上网用搜索引擎,就像上面的解决方案,其实答案很简单,多想想也许就想到了,这是一点!最后一点,用搜索引擎,最好用google,而且搜英文,这样很快就能搜到想要的结果,否则的话,用百度搜半天中文估计都搜不到结果,而且就算搜到的基本上是互相原封不动抄袭过来的,没太大参考价值!
(全文完)