Java 通过反射获取注解值

(1)定义一个注解

package com.zyq.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 通用配置注解
 * @author zyq
 * @date 2019-04-22
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Desc {
    String value ();
    String remark () default "";
}

(2)定义一个类,类的属性上使用该注解

package com.zyq.consts;

import com.zyq.annotation.Desc;

/**
 * 用户状态
 * @author zyq
 * @date 2019-04-22
 */
public class UserStatus {

    @Desc(value = "正常")
    public static int NORMAL = 1;

    @Desc(value = "非正常", remark="该状态用户不能登录")
    public static int ABNORMAL = 2;

}

(3)定义一个与注解属性对应的类

package com.zyq.vo;

public class FixedVo {

    public int key;
    public String value;
    public String remark;

    public int getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }

    public String getRemark() {
        return remark;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "FixedVo [key=" + key + ", value=" + value + ", remark="
                + remark + "]";
    }
}

(4)创建一个注解工具类,提供解析注解的方法

package com.zyq.tools;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import com.zyq.annotation.Desc;
import com.zyq.vo.FixedVo;

public class AnnotationTool {

    /**
     * 获取打了Desc注解的字典属性列表
     * @param t 类
     * @return 字典属性列表
     */
    public static <T> List<FixedVo> getFixedVoList(Class<T> c) {
        if (c == null) {
            return Collections.emptyList();
        }
        try {
            T cls = c.newInstance();
            Field[] fields = c.getDeclaredFields();
            List<FixedVo> fixedVoList = new LinkedList<FixedVo>();
            for (Field field : fields) {
                Desc desc = field.getAnnotation(Desc.class);
                if (desc != null) {
                    FixedVo vo = new FixedVo();
                    vo.setKey(field.getInt(cls));
                    vo.setValue(desc.value());
                    vo.setRemark(desc.remark());
                    fixedVoList.add(vo);
                }
            }
            return fixedVoList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }

}

(4)测试类代码

package com.zyq.tools.test;

import java.util.List;

import org.junit.Test;

import com.zyq.consts.UserStatus;
import com.zyq.tools.AnnotationTool;
import com.zyq.vo.FixedVo;

public class AnnotationToolTest {

    @Test
    public void getFixedVoListTest(){
        List<FixedVo> voList = AnnotationTool.getFixedVoList(UserStatus.class);
        for (FixedVo vo : voList) {
            System.out.println(vo.toString());
        }
    }

}

(4)测试结果:

FixedVo [key=1, value=正常, remark=]
FixedVo [key=2, value=非正常, remark=该状态用户不能登录]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值