当前位置:网站首页>案例:检查空字段【注解+反射+自定义异常】
案例:检查空字段【注解+反射+自定义异常】
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
- koa中间件
- README. txt
- The "advertising maniacs" in this group of programmers turned Tiktok advertisements into ar games
- Ce n'est qu'en apprenant que c est à la hauteur des attentes Top5 s1e8 | s1e9: caractères et chaînes & opérateurs arithmétiques
- 吴军三部曲见识(七) 商业的本质
- Many papers on ByteDance have been selected into CVPR 2021, and the selected dry goods are here
- 逻辑运算指令
- 字节跳动春招攻略:学长学姐笔经面经,还有出题人「锦囊」
- Resume of a microservice architecture teacher with 10 years of work experience
猜你喜欢
The "advertising maniacs" in this group of programmers turned Tiktok advertisements into ar games
Flink 解析(七):时间窗口
README. txt
IDEA断点调试技巧,多张动图包教包会。
Activiti directory (III) deployment process and initiation process
Many papers on ByteDance have been selected into CVPR 2021, and the selected dry goods are here
ByteDance overseas technical team won the championship again: HD video coding has won the first place in 17 items
JVM之垃圾回收器下篇
Shell_ 07_ Functions and regular expressions
Flink 解析(四):恢复机制
随机推荐
Logical operation instruction
TCP's three handshakes and four waves
Only learning C can live up to expectations top5 S1E8 | S1E9: characters and strings & arithmetic operators
Fdog series (III): use Tencent cloud SMS interface to send SMS, write database, deploy to server, web finale.
Flink源码解读(一):StreamGraph源码解读
原型链继承
was unable to send heartbeat
Shell_ 03_ environment variable
Notes on how the network is connected
唯有學C不負眾望 TOP5 S1E8|S1E9:字符和字符串&&算術運算符
DS18B20数字温度计系统设计
MySQL string function
Flink 解析(一):基础概念解析
JVM之垃圾回收器下篇
学习投资大师的智慧
MySQL date function
Alibaba cloud server builds SVN version Library
Basic knowledge of assembly language
Activiti directory (III) deployment process and initiation process
Activiti目录(四)查询代办/已办、审核