首页 > 其他分享 >根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableField(value = "create_time", fill

根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableField(value = "create_time", fill

时间:2024-10-30 17:08:42浏览次数:1  
标签:INSERT String 实体 createTime annotation value public 属性

根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableField(value = "create_time", fill = FieldFill.INSERT)

  • Field[] fields = clazz.getFields(); //仅能获取类(及其父类) public属性成员
  • Field[] declaredFields = clazz.getDeclaredFields(); //仅能获取类本身的属性成员(包括私有、共有、保护)
  • Field[] superDeclaredFields = clazz.getSuperclass().getDeclaredFields(); //因此在获取父类的私有属性时,要通过getSuperclass的之后再通过getDeclaredFiled获取。

BaseEntity.java

public class BaseEntity implements Serializable {
    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

SysRole.java


/**
 * 角色
 */
@Schema(description = "角色信息")
@TableName("sys_role")
public class SysRole extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 主健ID
     */
    @Schema(description = "主健ID")
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
    /**
     * 角色标识
     */
    @Schema(description = "角色标识")
    @TableField(value = "code")
    private String code;

    

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

}

MybatisPlusTest


import com.baomidou.mybatisplus.annotation.TableField;
import com.cuwor.base.entity.SysRole;
import io.swagger.v3.oas.annotations.media.Schema;
import org.junit.jupiter.api.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field; 

public class MybatisPlusTest {

    @Test
    void queryWrapperTest() {
        String propertyName = "createTime";
        String columnName = getAnnotationValue(SysRole.class, propertyName, TableField.class);
        System.out.println("Database column name for '" + propertyName + "' is: " + columnName);
        String condition = getAnnotationValue(SysRole.class, propertyName, Schema.class, "description");
        System.out.println("@Schema description is: " + condition);
    }


    /**
     * 根据字符串,找到对应属性,获取Annotation的值
     *
     * @param clazz 被查找对象
     * @param propertyName  被查找属性
     * @param annotationClass 注释类
     * @param methodNames     注释类的方法
     * @param <T>
     * @return
     */
    public static <T extends Annotation> String getAnnotationValue(Class<?> clazz, String propertyName, Class<T> annotationClass, String... methodNames) {
        try {
            // 首先检查当前类中的字段 -- 仅能获取类本身的属性成员(包括私有、共有、保护)
            Field[] declaredFields = clazz.getDeclaredFields();
            for (Field field : declaredFields) {
                if (field.getName().equals(propertyName)) {
                    T annotation = field.getAnnotation(annotationClass);
                    if (annotation != null) {
                        // 这里假设注解有一个名为 "value" 的方法返回 String 类型
                        // 你需要根据实际的注解定义来调整
                        java.lang.reflect.Method valueMethod = annotationClass.getMethod(methodNames.length > 0 ? methodNames[0] : "value");
                        return (String) valueMethod.invoke(annotation);
                    }
                }
            }

            // 如果没有在当前类中找到,就检查父类 -- 在获取父类的私有属性时,要通过getSuperclass的之后再通过getDeclaredFiled获取。
            Class<?> superclass = clazz.getSuperclass();
            while (superclass != null) {
                Field[] superDeclaredFields = superclass.getDeclaredFields();
                for (Field field : superDeclaredFields) {
                    if (field.getName().equals(propertyName)) {
                        T annotation = field.getAnnotation(annotationClass);
                        if (annotation != null) {
                            java.lang.reflect.Method valueMethod = annotationClass.getMethod(methodNames.length > 0 ? methodNames[0] : "value");
                            return (String) valueMethod.invoke(annotation);
                        }
                    }
                }
                superclass = superclass.getSuperclass();  // 递归搜索父类
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null; // 如果没有找到对应的注解或属性,返回null
    }
}

image

标签:INSERT,String,实体,createTime,annotation,value,public,属性
From: https://www.cnblogs.com/vipsoft/p/18516203

相关文章

  • DBeaver如何导出insert的sql数据
    前言我们在使用DBeaver连接数据库的时候,有时候需要将数据库某张表的数据全部导出,用于导入到其他的数据库。一般导出的格式有csv,也要sql语句,今天就来介绍下如何导出sql语句。这样在其他新的数据库中,就能直接执行插入了。如何操作首先,我们点击下我们要导出的数据库表,然后鼠标右击......
  • angular - 阅读zone.js代码引出的访问器属性问题
    对websocket的onmessageonerroronopenonclose事件是如何被zone.js代理存在疑问,阅读了zone.js的源码此处对WebSocket.prototype的onmessageonerroronopenonclose进行patch操作 具体的patch操作如下:  对WebSocket.prototype上的访问器属性(区别于数据属性)而言,webSo......
  • angular - 属性修饰器的使用
    参考文章https://zhuanlan.zhihu.com/p/65764702 例子:以前的代码,针对表格的滚动区高度动态设置代码,需要在每个组件里利用ResizeObserver监听表格容器尺寸变化,然后动态修改滚动区高度,这样在代码里存在大量的相似冗余  引入属性修饰器,能够抽象公共代码,如下 业务组件......
  • C# 13(.Net 9) 中的新特性 - 半自动属性
    C#13即.Net9按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览其中的一个新特性:作者注:该特性虽然随着C#13发布,但是仍然是处于preview状态的特性,请谨慎使用半自动属性Semi-autoproperties大家都知道,C#早在3.0时候就添加了自动属性这个特性,让我......
  • 界面控件DevExpress WPF v24.1新版亮点:属性网格、轻量级主题升级
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpressWPF控件今年一个重大版本——v24.1全......
  • List<Map<String,Object>> 属性获取
    publicstaticvoidmain(String[]args){//1.数据准备List<Map<String,Object>>list=newArrayList<>();Map<String,Object>map=newHashMap<>();map.put("name","songwp");......
  • 学习笔记(六):ArkUi-线性布局 (Row/Column)常用属性
    一、space属性设置排列方向上子元素的间距,使各子元素在排列方向上有等间距效果。 二、alignItems属性设置子元素在交叉轴(排列方向的垂直方向)上的对齐方式。且在各类尺寸屏幕中,表现一致。其中,交叉轴为垂直方向时,取值为VerticalAlign类型,水平方向取值为HorizontalAlign类型。......
  • autofac属性注入
    usingAutofac;namespaceautofac属性注入;internalclassProgram{staticvoidMain(string[]args){//创建一个容器ContainerBuilderbuilder=newContainerBuilder();//注册UserServicebuilder.RegisterType<UserService......
  • 计算属性get、set
    计算属性通过使用var关键字定义importUIKitstructPerson{privatevarvalue=""varname:String{set(param){value=param+"-heool-"print("set-"+param)}......
  • 关于手动关闭多个el-popover的方法且不使用visible属性
    1.在el-popover使用ref<el-popoverref="motifyPopover":width="260"trigger="click"popper-class="modify-popover"/>2.声明motifyPopoverconstmotifyPopover=ref<InstanceType<typeofElPopover>>()......