注解实现:判空赋值

文章介绍了如何使用Java注解`@CheckParam`配合反射机制来实现对对象属性的判空赋值。注解定义了`@Target(ElementType.FIELD)`和`@Retention(RetentionPolicy.RUNTIME)`,确保在运行时生效。在反射工具类中,通过获取类对象的属性,检查并修改被注解的空值属性。示例代码展示了具体实现过程。

流程:

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

注解定义及实现

注解定义:

 

less

复制代码

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

创建对应实体:

 

less

复制代码

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

反射工具类实现

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

反射的具体使用:www.cnblogs.com/xbhog/p/149…

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

工具类的实现流程:

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

代码实现:

 

kotlin

复制代码

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值