元注解说明
Java提供了几个元注解来修饰自定义注解:
-
@Retention:指定注解的保留策略-
RetentionPolicy.SOURCE:仅存在于源代码中 -
RetentionPolicy.CLASS:存在于字节码中,但运行时不可见 -
RetentionPolicy.RUNTIME:运行时可见,可通过反射读取
-
-
@Target:指定注解可以应用的目标-
ElementType.TYPE:类、接口、枚举 -
ElementType.FIELD:字段 -
ElementType.METHOD:方法 -
ElementType.PARAMETER:参数 -
ElementType.CONSTRUCTOR:构造函数 -
ElementType.LOCAL_VARIABLE:局部变量 -
ElementType.ANNOTATION_TYPE:注解 -
ElementType.PACKAGE:包 -
ElementType.TYPE_PARAMETER:类型参数(Java 8+) -
ElementType.TYPE_USE:类型使用(Java 8+)
-
-
@Documented:包含在Javadoc中 -
@Inherited:允许子类继承父类的注解
一个注解的实现过程。首先编写注解,使用注解,实现注解的逻辑。
案例代码:
// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface NotNull {
String message() default "不能为空";
}
//使用注解
public class User {
@NotNull(message = "name不能为空")
private String name;
private int age;
}
//实现注解的逻辑
public class Validator {
public static void validate(Object obj) throws IllegalAccessException, ValidationException {
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields){
field.setAccessible(true);
NotNull notNull = field.getAnnotation(NotNull.class);
if (field.isAnnotationPresent(NotNull.class)){
Object value = field.get( obj);
if (value instanceof String && ((String)value).isBlank()){
throw new ValidationException(notNull.message());
}
}
}
}
}
//自定义异常
public class ValidationException extends Exception {
public ValidationException(String message) {
super(message);
}
}
//验证注解是否生效
public class UserMain {
public static void main(String[] args) {
System.out.printf("开始");
User user = new User("", 18);
try {
Validator.validate(user);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (ValidationException e) {
throw new RuntimeException(e);
}
}
}

703

被折叠的 条评论
为什么被折叠?



