当前位置:网站首页>案例:检查空字段【注解+反射+自定义异常】
案例:检查空字段【注解+反射+自定义异常】
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:关于反射执行效率
边栏推荐
- 汇编语言寻址方式
- Shell_ 01_ data processing
- Description of project structure configuration of idea
- 一个数10年工作经验的微服务架构老师的简历
- Shell_ 03_ environment variable
- SQL tuning notes
- 控制转移指令
- Activiti directory (III) deployment process and initiation process
- TCP的三次握手和四次挥手
- Train 100 pictures for 1 hour, and the style of the photos changes at will. There is a demo at the end of the article | siggraph 2021
猜你喜欢

Flink 解析(四):恢复机制

Log4j2 major vulnerabilities and Solutions

Some instructions on whether to call destructor when QT window closes and application stops

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

The daemon thread starts redis and modifies the configuration file

1. JVM入门介绍

Prototype chain inheritance

MySQL digital function

MySQL字符串函数

Resume of a microservice architecture teacher with 10 years of work experience
随机推荐
À propos de l'utilisation intelligente du flux et de la carte
算数运算指令
8086 segmentation technology
On the clever use of stream and map
Instructions for Redux
暑假刷题嗷嗷嗷嗷
redux使用说明
唯有学C不负众望 TOP1环境配置
README. txt
was unable to send heartbeat
JVM之垃圾回收器上篇
Full record of ByteDance technology newcomer training: a guide to the new growth of school recruitment
Activiti目录(四)查询代办/已办、审核
Shell_ 05_ operator
原型链继承
Shell_ 03_ environment variable
Only learning C can live up to expectations top3 demo exercise
The "advertising maniacs" in this group of programmers turned Tiktok advertisements into ar games
字节跳动海外技术团队再夺冠:高清视频编码已获17项第一
Only learning C can live up to expectations Top1 environment configuration