注解实现:判空赋值

news2024/11/29 10:54:38

工作中的小玩意~~

流程:

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

注解定义及实现

注解定义:

@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;
}

反射工具类实现

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

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

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

工具类的实现流程:

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

代码实现:

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

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈工大2023春计算机组成原理真题回忆

仅供同学参考&#xff0c;严禁用作商业用途 如发现将追究责任 2023-5-14 属鼠经历了计算机组成原理考试 现将本人真题回忆如下&#xff1a;欢迎大家补充&#xff0c;并期待大家一起参与这个开源的项目。 致谢:真诚感谢草履虫同学提供的图片 15个选择部分回忆如下 &#xff1a…

【历史上的今天】4 月 13 日:Damn Small Linux 首次发布;谷歌关闭短网址服务;数学先驱出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 13 日&#xff0c;在 2006 年的今天&#xff0c;盛大文学榕树下网站被民营企业收购&#xff1b;原创文学网站榕树下被民营传媒集团欢乐传媒收购&#xff…

hnust 湖南科技大学 2023 软件测试技术 期中考试 复习资料

前言 写的比较匆忙&#xff0c;重点也不明确&#xff0c;没什么参考价值致谢&#xff1a;ly&#xff0c;zxq重点来源&#xff1a;信安※&#xff1a;补充内容★&#xff1a;重点✦&#xff1a;个人推测考点考试范围&#xff1a;1-9章获取最新版本 题型 判断&#xff1a;10简…

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1)

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1) 我们以HIV蛋白酶-抑制剂复合物为例子&#xff0c;跑Amber动力学模拟 下载1phv 从PBD下载文件&#xff1a;https://www.rcsb.org/ PDB文件预处理 我们以 “protein(water) ligandcomplex” 为例来说一下如何处…

系统设计基本原理-耦合与内聚

耦合 耦合是模块之间的相互独立性(互相连接的紧密程度)的度量&#xff0c;耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等。 耦合类型 无直接耦合&#xff1a;指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&…

k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权

文章目录 一、K8s安全框架1.1 鉴权1.1.1 HTTPS证书认证1.1.2 HTTP Token认证 1.2 授权1.3 准入控制1.4 集群四大角色 二、RBAC给用户授权&#xff08;TLS&#xff09;2.1 签发客户端证书2.2 生成kubeconfig授权文件2.2.1 手动生成2.2.2 脚本生成2.2.3 切换操作集群 2.3 定义RBA…

移动应用开发实验-内容提供者-ContentResolver的使用

文章目录 前言读取通讯录信息要求环境 具体实现主页面布局(activity_main.xml)关于RecyclerView库的相关问题添加RecyclerView库操作 解决报错Item布局(info.xml)添加访问权限编写实体类&#xff08;ContactInfo.java&#xff09;编写适配器&#xff08;MyAdapter.java&#xf…

20 散列表的查找

散列表的查找 简介&#xff1a;散列表&#xff08;也成哈希表&#xff09;是一种高效的数据结构&#xff0c;他可以在平均复杂度为O(1)的情况下实现查找、插入和删除操作。 哈希表的基本思想是根据关键字的值来计算其应存储的位置。这个计算过程就是通过哈希函数来实现的。 根…

计算机视觉——day 91基于双网络的鲁棒特征高光谱目标检测(偏门且很水啊)

基于双网络的鲁棒特征高光谱目标检测 I. INTRODUCTIONII. 提出的方法A. 总体框架B.训练集构建C. Dual Networks III. EXPERIMENTSIV. 结论 I. INTRODUCTION 用于高光谱目标检测的深度网络训练通常面临样本有限的问题&#xff0c;在极端情况下&#xff0c;可能只有一个目标样本…

黑盒测试方法

1 等价类划分 1.1 定义 等价类划分法是一种典型的&#xff0c;并且是最基础的黑盒测试用例设计方法。采用等价类划分法时&#xff0c;完全不用考虑程序内部结构&#xff0c;设计测试用例的唯一依据是软件需求规格说明书。 所谓等价类&#xff0c;是输入条件的一个子集合&…

kali整体版本更新方法,为啥更新?

玩过kali都知道&#xff0c;如果不更新版本&#xff0c;那么安装某个软件总是有很多依赖版本问题&#xff0c;解决起来的确麻烦&#xff0c;这篇文章彻底解决这些问题。 1&#xff0c;更新源 国外源与国内源的选择 kali默认配置的是国外源&#xff0c;但国外源的下载速度非常慢…

基于容器和Kubernetes的应用无限扩容

基于应用负载动态管理CPU、内存等资源的使用是云原生架构的最佳实践之一&#xff0c;Kubernetes通过资源请求和限制以及HPA/VPA等机制&#xff0c;为云原生应用资源管理提供了很好的支持。原文: Infinite Scaling with Containers and Kubernetes[1] 如果没有足够资源让容器完成…

matlab第八章_Simulink简介

目录 Simulink简介 基本知识 Simulink组成 模块库简介 Simulink系统仿真 Stateflow建模与应用 Stateflow的定义 状态图编辑器 Stateflow流程图 Simulink简介 基本知识 Simulink是实现动态系统建模&#xff0c;仿真和分析的软件包&#xff0c;被广泛应用于线性系统&…

土地报征简介

报征概念&#xff1a; 土地报征是指国家为了人民整体利益出发&#xff0c;根据我国相关法律和法规的要求和流程&#xff0c; 将集体土地性质转化为国有土地性质&#xff0c;并给予被征地的对象给予合理的补偿和安置工作。报征4个价段&#xff1a; 1、组卷阶段 &#xff08;1&…

Linux系统之top命令的基本使用

Linux系统之top命令的基本使用 一、top命令介绍二、检查本地环境1. 检查操作系统版本2. 检查系统内核版本 三、top命令的使用帮助1. top命令的选项2. top命令的交换命令 四、top显示信息解释1. top的第一行解释2. top的第二、三行信息解释3. top的第四、五行信息解释4. top的进…

Java 常用注解的使用

在Java中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了一种机制&#xff0c;可以将元数据与代码一起存储&#xff0c;并使其可用于编译器、解释器或其他工具的处理。注解可以在Java源代码中添加元数据&#xff0c;以提供更多的信息&…

【Linux】Linux基本指令(3)

一.时间的相关指令 date显示 单纯的输入 date 会以这种形式输出&#xff1a; 但其实这种形式我们看着是不太习惯的&#xff0c;我们可以指定形式输出&#xff1a; 格式为&#xff1a;date 选项 %H : 小时(00..23) %M : 分钟(00..59) %S : 秒(00..61) %X : 相当于 %H:%M:%S %d …

Qt扫盲-QPieSlice理论总结

QPieSlice理论总结 一、概述二、标签三、属性设置四、信号说明 一、概述 QPieSlice 类表示饼图中的单个QPieSlice。饼图QPieSlice有一个值和一个标签。将QPieSlice添加到饼图时&#xff0c;QPieSeries对象将自动计算QPieSlice的百分比&#xff0c;并与序列中所有QPieSlice的总…

Java SE(十一)之包装类(各种类型之间的转换)

文章目录 Object类 &Number类1.Object2.Number类 包装类&#xff0c;装箱&#xff0c;拆箱1.手动装箱/拆箱2.自动装箱/ 拆箱 应用——常见包装类1.Integer类2.Character类3.实战——各种类型之间的转换&#xff08;1&#xff09;int和Integer相互转换&#xff08;2&#xf…

20230514-SmartChat测试效果图

E:\20230514-SmartChat测试效果图您好&#xff0c;我是SmartChat&#xff0c;新生代智能机器人&#xff0c;通过运用自然语言处理、机器学习和人工智能等高精尖技术&#xff0c;可以与您进行自然、流畅、有趣的对话&#xff0c;帮助您获取所需的信息和服务。无论您想要写商业计…