注解实现:判空赋值

科技资讯 投稿 6000 0 评论

注解实现:判空赋值

工作中的小玩意~~

流程:

    注解实现
  1. 反射工具类

注解定义及实现

@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,运行周期在运行时有效。

创建对应实体:

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

反射工具类实现

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

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

工具类的实现流程:

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

代码实现:

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(;

            }
        }
    }
}

实现效果:

/**
 * @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(;
    }
}

编程笔记 » 注解实现:判空赋值

赞同 (29) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽