工作中的小玩意~~
流程:
- 注解完成
- 反射工具类
注解定义及完成
注解定义:
@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…
经过与注解的调配,咱们能够完成在运转期中获取方针方针的特点进行判别及赋值。
工具类的完成流程:
- 获取操作方针,即传入的类方针
- 获得方针中一切的特点
- 敞开私有的特点的拜访权限
- 前置校验(是否被自定义注解修饰过)
- 完成目的:特点为空,则赋值(判空赋值)
代码完成:
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());
}
}