工作中的小玩意~~
流程:
- 註解實現
- 反射工具類
註解定義及實現
註解定義:
@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
透過與註解的搭配,我們可以實現在執行期中獲取目標物件的屬性進行判斷及賦值。
工具類的實現流程:
- 獲取操作物件,即傳入的類物件
- 獲得物件中所有的屬性
- 開啟私有的屬性的訪問許可權
- 前置校驗(是否被自定義註解修飾過)
- 實現目的:屬性為空,則賦值(判空賦值)
程式碼實現:
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());
}
}