注解实现:判空赋值

news/2024/5/19 6:59:25 标签: java, spring, 反射, 注解

工作中的小玩意~~

流程:

  1. 注解实现
  2. 反射工具类

注解定义及实现

注解定义:

java">@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckParam {
    String value() default "-1";
}

简单解释上述其相关注解

**Target:**描述了注解修饰的对象范围,取值在java.lang.annotation.ElementType定义,常用的包括:

  • CONSTRUCTOR: 用于描述构造器
  • FIELD: 用于描述域
  • LOCAL_VARIABLE: 用于描述局部变量
  • METHOD : 用于描述方法
  • PACKAGE: 用于描述包
  • PARAMETER: 用于描述参数
  • TYPE: 用于描述类、接口(包括注解类型) 或enum声明

Retention: 表示注解保留时间长短。取值在java.lang.annotation.RetentionPolicy中,取值为:

  • SOURCE:在源文件中有效,编译过程中会被忽略
  • CLASS:随源文件一起编译在class文件中,运行时忽略
  • RUNTIME:在运行时有效**(大部分注解的选择)**

这里我们的目的是为了实现对对象属性的判空赋值,所以Target选择的修饰的范围是FIELD,运行周期在运行时有效。

创建对应实体:

java">@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sample{
    @CheckParam
    private String id;
    @CheckParam
    private String name;
}

反射工具类实现

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性

反射的具体使用:https://www.cnblogs.com/xbhog/p/14987005.html

通过与注解的搭配,我们可以实现在运行期中获取目标对象的属性进行判断及赋值。

工具类的实现流程:

  1. 获取操作对象,即传入的类对象
  2. 获得对象中所有的属性
  3. 开启私有的属性的访问权限
  4. 前置校验(是否被自定义注解修饰过)
  5. 实现目的:属性为空,则赋值(判空赋值)

代码实现:

java">package com.example.containstest.containsTestDemo.utils;

import com.example.containstest.containsTestDemo.annotation.CheckParam;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;

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

/**
 * @author xbhog
 * @describe:
 * @date 2023/5/11
 */
public class ChecFieldkUtil {
    public static <T> void checkParamsFiled(T t) throws RuntimeException, IllegalAccessException {
        if (null == t) {
            throw new RuntimeException("obj is null");
        }
        //获取class对象
        Class<?> aClass = t.getClass();

        //获取当前对象所有属性 使用带Declared的方法可访问private属性
        Field[] declaredFields = aClass.getDeclaredFields();
        //遍历对象属性
        for (Field field : declaredFields) {
            //开启访问权限
            field.setAccessible(true);
            //使用此方法 field.get(Object obj) 可以获取 当前对象这个列的值
            Object o = field.get(t);
            CheckParam annotation = field.getDeclaredAnnotation(CheckParam.class);
            //如果没有设置当前注解 不用校验
            if (annotation == null) {
                continue;
            }
            //获取注解接口对象
            //如果设置了当前注解,但是没有值,抛出异常
            if (o == null || StringUtils.isBlank(ObjectUtils.toString(o))) {
                System.out.println("========"+ annotation.value());
                field.set(t,annotation.value());

            }
        }
    }
}

实现效果:

java">/**
 * @author xbhog
 * @describe:
 * @date 2023/5/11
 */
public class TestClass511 {
    @Test
    public  void demo12() throws IllegalAccessException {
        Sample sample = new Sample();
        CheckUtil.checkUserFiled(sample);
        System.out.println(sample.getName());
    }
}

img


http://www.niftyadmin.cn/n/319866.html

相关文章

uboot fatal error: configs/.h: No such file or directory 解决方法

环境 Win10 64位 ubuntu 20.04 虚拟机 VMware Workstation 16 Pro 开发板&#xff1a;NK-980IOT&#xff08;NUC980DK61Y&#xff09; gcc 交叉编译工具链&#xff1a; ARM 官方 gcc version 11.2.1 20220111 NUC980 uboot 版本 &#xff1a;尝试移植到 u-boot-2019.10&am…

ES报错FORBIDDEN/12/index read-only / allow delete (api)的解决办法

错误&#xff1a;blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]; 解决办法&#xff1a; 批量设置索引 curl -XPUT -H "Content-Type: application/json" http://xxx.xxx.xxx.xxx:19200/_all/_settings -d {"index.blocks.read_only_allow…

冰点还原2023中文版最新电脑系统数据恢复软件

冰点还原是什么&#xff1f;对其不了解的用户可能会认为它是《冰雪奇缘》的番外篇或续篇之类的&#xff0c;其实它们俩没有半毛钱关系&#xff0c;它其实是一款系统还原备份软件。冰点还原精灵是一款强大的系统备份、还原、修复软件&#xff0c;可以在极短时间内将系统还原到初…

uboot symbol value ‘‘ invalid for SYS_TEXT_BASE 解决方法

环境 Win10 64位 ubuntu 20.04 虚拟机 VMware Workstation 16 Pro gcc 交叉编译工具链&#xff1a; ARM 官方 gcc version 11.2.1 20220111 NUC980 uboot 版本 &#xff1a;尝试移植到 u-boot-2019.10&#xff0c;官方当前 u-boot 版本为 2016.11 问题描述 升级 u-boot …

电动力学专题:等离子体

等离子体 当物质温度升高或受到电离时,电子和正离子分离,形成由电子和正离子组成的物质状态.这种电离物质在宏观上保持电中性&#xff0c;就称为等离子体等离子体具有屏蔽外部电势的特性&#xff0c;称为德拜屏蔽。这种屏蔽赋予等离子体准中性特性。 准电中性与屏蔽库伦场 热…

C++ Primer第五版_第十六章习题答案(31~40)

文章目录 练习16.31练习16.32练习16.33练习16.34练习16.35练习16.36练习16.37练习16.38练习16.39练习16.40 练习16.31 如果我们将 DebugDelete 与 unique_ptr 一起使用&#xff0c;解释编译器将删除器处理为内联形式的可能方式。 练习16.32 在模版实参推断过程中发生了什么&…

C语言——操作符详解

哈喽&#xff0c;大家好&#xff0c;今天我们来学习C语言中的各中操作符。 目录 1.操作符的分类 2.算数操作符 整数的二进制表示 3.位移操作符 3.1左移操作符 3.2右移操作符 4.位操作符 5.赋值操作符 6.单目操作符 6.1 单目操作符介绍 ~ 的用法&#xff1a; 6.2 si…

Android+SQLite家庭食物储藏有效期提醒信息app源码

一个新的时代--移动互联网已经微笑着迎面而来。移动互联网与智能手机有着自身独特的优势&#xff0c;使得人们更方便的办公、娱乐&#xff0c;生活更加轻松。为了使人们对家庭里的食物能够更科学的管理&#xff0c;让人们随时随地能了解家庭所储藏食物的情况&#xff0c;及时让…