首页 > 编程语言 >Java 通过反射获取注解属性信息

Java 通过反射获取注解属性信息

时间:2023-11-28 18:27:09浏览次数:32  
标签:反射 Java String label return key 注解 public 属性

一、创建存储对象

// 属性对象存储类
public class MetadataFiled {

    /**
     * key 对应对象中间的属性
     */
    private String key;

    /**
     * 字段标签
     */
    private String label;

    public MetadataFiled(String key, String label) {
        this.key = key;
        this.label = label;
    }

    public String getKey() {
        return key;
    }

    public String getLabel() {
        return label;
    }

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

    public void setLabel(String label) {
        this.label = label;
    }
}

 

二、工具类(通过ApiModelProperty注解获取字段属性信息)

// 对象属性封装类
public class ReflectionUtils {

    /**
     * 获取属性名(使用下划线命名法)与对应中文名的映射关系。
     *
     * @param clazz 要获取属性信息的类
     * @return 属性名与中文名的映射关系
     */
    public static Map<String, String> getFiledMap(Class<?> clazz) {
        Map<String, String> propertyMap = new HashMap<>();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
            if (annotation != null) {
                String propertyName = field.getName();
                String chineseName = annotation.value();

                // 将驼峰命名转换为下划线命名
                String underscoredName = camelToUnderscore(propertyName);
                propertyMap.put(underscoredName, chineseName);
            }
        }
        return propertyMap;
    }

    /**
     * 获取属性元数据列表,每个元素包含属性名(使用下划线命名法)和对应中文名。
     *
     * @param clazz 要获取属性信息的类
     * @return 包含属性元数据的列表
     */
    public static List<MetadataFiled> getFiled(Class<?> clazz) {
        List<MetadataFiled> propertyMetadataList = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
            if (annotation != null) {
                String propertyName = field.getName();
                String chineseName = annotation.value();

                // 将驼峰命名转换为下划线命名
                String underscoredName = camelToUnderscore(propertyName);
                propertyMetadataList.add(new MetadataFiled(underscoredName, chineseName));
            }
        }
        return propertyMetadataList;
    }

    /**
     * 将驼峰命名字符串转换为下划线命名。
     *
     * @param input 驼峰命名的字符串
     * @return 转换为下划线命名的字符串
     */
    private static String camelToUnderscore(String input) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < input.length(); i++) {
            char currentChar = input.charAt(i);
            if (Character.isUpperCase(currentChar)) {
                result.append("_").append(Character.toLowerCase(currentChar));
            } else {
                result.append(currentChar);
            }
        }
        return result.toString();
    }
}

 

三、构建 ApiModelProperty注解对象

import com.fasterxml.jackson.annotation.JsonFormat;
import com.yf.mybatis.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @author : FengQing
 * @date :Created in 2023-11-10
 * @modified By:
 * @version: 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ReceiptDTO extends BaseEntity {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("测试1")
    private String channelName;

    @ApiModelProperty("测试2")
    private String channelAs;

}

 

四、前端控制器调用

@ApiOperation(value = "分页列表", notes = "分页列表")
    @PostMapping("/page")
    public R<PageUtils<ReceiptVo>> list(@RequestBody Map<String, Object> params){
        PageUtils<ReceiptVo> page = receiptService.selectReceiptPage(params);
        // 获取属性名和中文描述的映射
        page.setFields(ReflectionUtils.getField(ReceiptDTO.class));
        return R.data(page);
    }

 

前端返回结果:【fields】获取属性名和中文描述的映射

{
    "code": 0,
    "msg": "操作成功",
    "data": {
        "totalCount": 1,
        "size": 10,
        "totalPage": 1,
        "current": 1,
        "fields": [
            {
                "key": "channel_name",
                "label": "测试1"
            },
            {
                "key": "channel_as",
                "label": "测试2"
            }
        ],
        "list": []
    }
}

 

标签:反射,Java,String,label,return,key,注解,public,属性
From: https://www.cnblogs.com/springclout/p/17862619.html

相关文章

  • java时区转换
    #用户时间转utc时间publicstaticDateconvertToUtcTime(Datedt,StringtimeZone){returnconvertToUtcTime(dt,TimeZone.getTimeZone(timeZone));}publicstaticDateconvertToUtcTime(Datedt,TimeZonetimeZone){longlocalTimeInMillis=dt.getTime();C......
  • JAVA记录
    关键字访问控制:public:用于声明成员(方法、变量等)为公共的,在任何地方都可以访问。protected:用于声明成员在同一个包内或者子类中可见。private:用于声明成员只能在所属类内部可见,无法被外部类或子类直接访问。类和方法修饰符:abstract:用于声明抽象方法或类。......
  • Java多线程转账
    Java多线程转账关键词:多线程,Java以前的一道面试题,要求是使用Java多线程,实现一个转账业务。不考虑数据库,不考虑其他第三方系统。只考虑当前Java程序内各个账户进行转账,保证转账金额正确性和转账功能效率。想起那大约还是两年前,是线上面试,面试官给完题目就关闭视频通话,让我自己去......
  • 《Effective Java》阅读笔记-第二章
    EffectiveJava阅读笔记第二章创建和销毁对象第1条:用静态工厂方法代替构造器静态工厂方法优势:静态工厂方法有名称静态工厂方法可以详细的指定名称,而使用构造器时如果没有文档会难以区分不同构造器之间的区别。不必每次调用的时候创建一个新对象静态工厂方法可以缓......
  • java字符串String类的常用方法
    java字符串String类的常用方法字符串的创建:(1)定义字符串直接赋值,在字符串池中开辟空间()Stringstr1=“Hello”;//在字符串池中写入字符串"hello"Stringstr2=“Hello”;//直接引用字符串池中的"Hello"System.out.println(str1==str2);//地址相同,输出:true(2)使用new关键字调用字......
  • 秦疆的Java课程笔记:42 流程控制 增强For循环
    Java5引入的一种主要用于数组或集合的增强型for循环。这里只是先了解一下。格式如下:for(声明语句:表达式){ //代码语句}声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用于限定在循环语句块,其值与此数组元素的值相等。表达式:表达式是要访问的数组......
  • 秦疆的Java课程笔记:43 流程控制 break、continue、goto
    break:在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break也在switch语句中使用)publicclassBreakDemo{publicstaticvoidmain(String[]args){inti=0;while(i<100){......
  • 秦疆的Java课程笔记:44 流程控制 打印三角形及Debug
    作业:打印5行三角形这是我写的:publicclassTestDemo1{publicstaticvoidmain(String[]args){intline=5;//定义总行数linefor(inti=1;i<=line;i++){//i是循环输出每一行for(intj=1;j<=line-i;j++){//j......
  • Java核心知识体系7:线程安全性讨论
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解Java核心知识体系6:集合框架详解1为什么需要多线程我们都知道,CPU、内存、I/O设备的速度是有极大差异的,为了合......
  • Java面试小练(四)
    请描述GET请求方式与POST请求方式的区别?post比get更安全,发送数据更大get和post都是http和服务器交互的方式get会将请求的数据放在url中,http协议头,中间用?来链接,用&来相连数据,中文会进行url加密post会将数据放在http的包体内发送get请求数据放在url,理论上没有大小限制,但是浏......