java反射本身不提供校验逻辑,但可结合@notnull等注解与hibernate validator等框架实现动态校验:先定义带注解的javabean,再通过validator实例自动扫描并验证,或手动反射提取注解校验(不推荐)。

Java 反射本身不提供校验逻辑,但可以配合注解(如 @NotNull、@Size)和校验框架(如 Hibernate Validator)实现对象属性的动态校验。核心思路是:通过反射获取字段及其注解,再调用校验器执行验证。
1. 定义带校验注解的 JavaBean
先在目标类的字段上添加标准 Bean Validation 注解:
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 18, message = "年龄不能小于18")
private int age;
// getter/setter 省略
}
2. 使用反射 + Validator 动态校验对象
不手动遍历字段判断,而是交由 Validator 实例统一处理。它内部已基于反射解析注解:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建
Validator实例(通常通过Validation.buildDefaultValidatorFactory().getValidator()) - 调用
validator.validate(object),自动扫描所有带约束注解的字段 - 返回
Set<constraintviolation>></constraintviolation>,包含所有校验失败信息
3. 手动反射提取字段校验(非推荐,仅用于理解原理)
若需完全自定义逻辑(比如跳过某些字段、按条件触发),可手动反射获取字段与注解:
- 用
obj.getClass().getDeclaredFields()获取全部字段 - 对每个字段调用
field.getAnnotation(NotBlank.class)等检查是否存在对应约束 - 设置
field.setAccessible(true)后读取值,再编写对应的空值、格式、范围等判断 - 注意:这种方式绕过了标准校验生态,难以复用分组、级联、国际化等能力
4. 实际使用建议
生产环境优先采用标准方式,避免重复造轮子:
- 引入
hibernate-validator依赖 - 校验前确保字段有 public getter 方法(否则 Validator 默认只校验 getter)
- 如需校验私有字段,可在类上加
@Access(AccessType.FIELD) - 结合 Spring 时,直接在 Controller 入参加
@Valid,框架自动完成反射校验和异常转换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










