我想以这种方式写一个对应的自定义校验注解
时间: 2024-02-25 12:52:49 浏览: 65
好的,您可以使用Java中的自定义注解来实现这一功能。以下是一个示例代码,您可以根据您的需求进行修改:
```
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyValidation {
int[] validValues(); // 定义需要校验的值
boolean notEmpty() default false; // 定义是否需要校验非空
String message() default "Validation failed!"; // 定义校验失败时的提示信息
}
```
在这个示例中,我们定义了一个名为MyValidation的注解,该注解包含三个属性:validValues、notEmpty和message。其中,validValues表示需要校验的值,notEmpty表示是否需要校验非空,message表示校验失败时的提示信息。
接下来,您可以在需要进行校验的变量上添加该注解,例如:
```
public class MyClass {
@MyValidation(validValues = {1, 2}, notEmpty = true, message = "Validation failed for a or b!")
private int a;
@MyValidation(validValues = {1, 2}, notEmpty = true, message = "Validation failed for a or b!")
private String b;
// 省略其他代码
}
```
在这个示例中,我们在变量a和b上添加了MyValidation注解,并设置了相应的属性。当需要对这些变量进行校验时,您可以使用反射来获取这些注解,并根据注解定义的规则进行校验。例如:
```
public static void validateObject(Object obj) throws Exception {
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(MyValidation.class)) {
MyValidation validation = field.getAnnotation(MyValidation.class);
field.setAccessible(true);
Object value = field.get(obj);
if (value == null) {
throw new Exception("Validation failed: " + field.getName() + " is null!");
}
if (validation.notEmpty() && value instanceof String && ((String) value).isEmpty()) {
throw new Exception("Validation failed: " + field.getName() + " is empty!");
}
boolean valid = false;
for (int validValue : validation.validValues()) {
if (value instanceof Integer && ((Integer) value).intValue() == validValue) {
valid = true;
break;
}
}
if (!valid) {
throw new Exception("Validation failed: " + field.getName() + " is invalid!");
}
}
}
}
```
在这个示例中,我们定义了一个validateObject方法,该方法接收一个Object类型的参数,并使用反射来获取该对象中所有带有MyValidation注解的变量。然后,根据注解定义的规则进行校验,如果校验失败,则抛出一个异常。
您可以根据您的实际需求进行修改和扩展。
阅读全文