当前位置:网站首页>案例:检查空字段【注解+反射+自定义异常】
案例:检查空字段【注解+反射+自定义异常】
2022-07-06 09:33:00 【小白说(๑• . •๑)】
学习永不止步!
一个结合了注解、反射、自定义异常知识的小案例——检查空字段!
1、定义一个规范类:凡是需要进行字段检查都需要实现
package com.dongzi;
/** * 定义规范化接口 */
public interface CheckRule {
}
2、定义实体类并实现规范接口:需要进行字段检查的需要加上CheckField注解,第3项附代码
package com.dongzi;
/** * 模拟实体类 */
public class Student implements CheckRule {
public Student() {
}
public Student(Integer id, Integer age, Integer sex, String name) {
this.id = id;
this.age = age;
this.sex = sex;
this.name = name;
}
private Integer id;
@CheckField(message = "学生年龄")
private Integer age;
private Integer sex;
@CheckField(message = "学生姓名")
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、定义检查字段注解
package com.dongzi;
import java.lang.annotation.*;
/** * 定义检查字段的注解 * <pre> * @Retention:指定运行时 * @Target:指定注解作用范围 * </pre> */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CheckField {
/** * 是否开启字段NULL值检查 * @return true 默认返回检查开启字段 */
boolean value() default true;
/** * 字段相关描述 */
String message();
}
4、自定义异常:检查到字段为NULL时抛出
package com.dongzi;
/** * 自定义检查异常 */
public class CheckException extends Exception{
/** * 无特殊实现直接调用父类构造 * @param msg 异常消息 */
public CheckException(String msg){
super(msg);
}
}
5、定义检查字段工具类:检查字段的方法
package com.dongzi;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/** * 定义异常检查工具类 */
public class CommentUtils {
/** * 检查空字段工具类 * * @param checkRule 需要被检查的bean */
public static void checkNonField(CheckRule checkRule) throws CheckException {
Class<? extends CheckRule> beanClass = checkRule.getClass();
Field[] fields = beanClass.getDeclaredFields();
if (fields.length > 0) {
for (Field field : fields) {
CheckField checkField = field.getAnnotation(CheckField.class);
if (checkField != null && checkField.value()) {
// field.setAccessible(true);
String fieldName = field.getName();
// TODO:没引入其他工具类,暂代
char[] chars = fieldName.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
fieldName = String.copyValueOf(chars);
String methodName = "get" + fieldName;
Object objVal;
try {
objVal = beanClass.getMethod(methodName).invoke(checkRule);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
// method invoke异常处理
}
if (objVal == null || "".equals(objVal)) {
throw new CheckException(checkField.message() + ":为必填项");
}
}
}
}
}
}
6、程序开始
package com.dongzi;
public class Main {
public static void main(String[] args) {
// Student student_1 = new Student(1, 23, 1, "法外狂徒——张三"); // 输出结果:~~~字段不为NULL
Student student_2 = new Student(1, null, 1, "法外狂徒——张三"); // 输出结果:学生年龄:为必填项
try {
CommentUtils.checkNonField(student_2);
System.out.println("~~~字段不为NULL");
} catch (CheckException e) {
e.printStackTrace();
}
}
}
7、两种执行结果
- 传入student_1对象:

- 传入student_2对象:

抛出异常,NULL字段检查完成!可完成一个Bean里面所有非空字段的检查。
附1:项目结构

附2:关于反射执行效率
边栏推荐
猜你喜欢

MySQL date function

MySQL digital function

算数运算指令

Thank you for your invitation. I'm in the work area. I just handed in the code. I'm an intern in the next ByteDance

这群程序员中的「广告狂人」,把抖音广告做成了AR游戏

Some feelings of brushing leetcode 300+ questions

Fdog series (VI): use QT to communicate between the client and the client through the server (less information, recommended Collection)

Shell_ 04_ Shell script

Instructions for Redux

ByteDance overseas technical team won the championship again: HD video coding has won the first place in 17 items
随机推荐
@RequestMapping、@GetMapping
ByteDance technical Interviewer: what kind of candidate do I want to pick most
Flink parsing (VI): savepoints
Interview collection library
Shell_ 03_ environment variable
Control transfer instruction
TCP的三次握手和四次挥手
DS18B20数字温度计系统设计
Set up the flutter environment pit collection
吴军三部曲见识(五) 拒绝伪工作者
Compile homework after class
字节跳动春招攻略:学长学姐笔经面经,还有出题人「锦囊」
Flink 解析(四):恢复机制
Introduction to spring trick of ByteDance: senior students, senior students, senior students, and the author "brocade bag"
Alibaba cloud server docker installation mysql5.5
MySQL digital function
"One year after graduation, I won ACL best paper"
数据传送指令
Flink 解析(六):Savepoints
Resume of a microservice architecture teacher with 10 years of work experience