反射获取枚举上的注解

本文主要介绍了如何使用Java反射来获取枚举类型的注解信息,从问题引出到详细解决方案,最后进行总结。
摘要由CSDN通过智能技术生成
  关于反射获取枚举上的信息,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,而且搜英文,这样很快就能搜到想要的结果,否则的话,用百度搜半天中文估计都搜不到结果,而且就算搜到的基本上是互相原封不动抄袭过来的,没太大参考价值!

(全文完)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值