工作中的小玩意~~
流程:
注解实现反射工具类注解定义及实现注解定义:
(资料图片仅供参考)
@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@AllArgsConstructorpublic class Sample{ @CheckParam private String id; @CheckParam private String name;}
反射工具类实现反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
反射的具体使用:https://www.cnblogs.com/xbhog/p/14987005.html
通过与注解的搭配,我们可以实现在运行期中获取目标对象的属性进行判断及赋值。
工具类的实现流程:
获取操作对象,即传入的类对象获得对象中所有的属性开启私有的属性的访问权限前置校验(是否被自定义注解修饰过)实现目的:属性为空,则赋值(判空赋值)代码实现:
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 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()); }}