当前位置:网站首页>案例:检查空字段【注解+反射+自定义异常】
案例:检查空字段【注解+反射+自定义异常】
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:关于反射执行效率
边栏推荐
- 控制转移指令
- ByteDance technical Interviewer: what kind of candidate do I want to pick most
- 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
- arithmetic operation
- [graduation project] QT from introduction to practice: realize imitation of QQ communication, which is also the last blog post in school.
- After idea installs the plug-in, restart the plug-in and disappear
- IDEA断点调试技巧,多张动图包教包会。
- Use of mongodb in node
- Log4j2 major vulnerabilities and Solutions
- Logical operation instruction
猜你喜欢
Fdog series (4): use the QT framework to imitate QQ to realize the login interface, interface chapter.
Shell_ 01_ data processing
Eight part essay that everyone likes
吴军三部曲见识(五) 拒绝伪工作者
Flink 解析(二):反压机制解析
MySQL digital function
JVM运行时数据区之程序计数器
字节跳动技术面试官现身说法:我最想pick什么样的候选人
Notes on how the network is connected
Flink 解析(三):内存管理
随机推荐
Use of mongodb in node
Shell_ 05_ operator
Flink 解析(二):反压机制解析
8086 segmentation technology
When it comes to Google i/o, this is how ByteDance is applied to flutter
Restful style interface design
GCC error: terminate called after throwing an instance of 'std:: regex_ error‘ what(): regex
DS18B20数字温度计系统设计
[graduation project] QT from introduction to practice: realize imitation of QQ communication, which is also the last blog post in school.
手把手带你做强化学习实验--敲级详细
js垃圾回收机制和内存泄漏
Typescript basic operations
JVM垃圾回收概述
IDEA断点调试技巧,多张动图包教包会。
Instructions for Redux
Activiti directory (IV) inquiry agency / done, approved
Shell_ 02_ Text three swordsman
Basic knowledge of assembly language
In the command mode in the VI editor, delete the character usage at the current cursor__ Command.
面试集锦库