工作中的小玩意~~

流程:

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

反射工具类完成

反射之所以被称为框架的灵魂,主要是因为它赋予了咱们在运转时剖析类以及执行类中办法的能力。经过反射能够获取任意一个类的一切特点和办法,你还能够调用这些办法和特点

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

经过与注解的调配,咱们能够完成在运转期中获取方针方针的特点进行判别及赋值。

工具类的完成流程:

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

注解实现:判空赋值