注解
public @interface Range{
int min() default 0;
int max() default 255;
}
注解分为3类:
-
编译使用的注解
-
@Override 让编译器检查方法是否实现覆写
-
@SuppressWarnings 告诉编译器忽略此处代码产生的警告
-
-
由工具处理
.class
文件使用的注解-
在加载Class的时候,对Class做动态修改
-
-
在程序运行期能够读取的注解,它们在加载后一直存在于jvm中(最常用)
-
@PostConstruct
在调用构造方法后自动被调用
-
定义类型:
-
所有基本类型
-
String
-
枚举类型
-
基本类型,String,Class以及枚举的数组
元注解
-
@Target
-
类或接口:
ElementType.TYPE
; -
字段:
ElementType.FIELD
; -
方法:
ElementType.METHOD
; -
构造方法:
ElementType.CONSTRUCTOR
; -
方法参数:
ElementType.PARAMETER
。
-
-
@Retention
-
仅编译期:
RetentionPolicy.SOURCE
;SOURCE
类型的注解在编译期就被丢掉了; -
仅class文件:
RetentionPolicy.CLASS
;CLASS
类型的注解仅保存在class文件中,它们不会被加载进JVM; -
运行期:
RetentionPolicy.RUNTIME
。RUNTIME
类型的注解会被加载进JVM,并且在运行期可以被程序读取。
-
-
@Repeatable
-
定义
Annotation
是否可重复
-
-
@Inherited
-
是否可继承父类定义的
Annotation
-
定义一个注解 Annotation
-
使用@interface
-
添加参数,默认值
-
使用以上元注解配置
使用以上定义的注解
//使用@Range注解来检查Java Bean的字段。如果字段类型是String,就检查String的长度,如果字段是int,就检查int的范围。
static void check(Person person) throws IllegalArgumentException, ReflectiveOperationException {
//利用反射,找到person对象的每一个字段
for (Field field : person.getClass().getFields()) {
//获取注解内容
Range range = field.getAnnotation(Range.class);
if (range != null) {
Object value = field.get(person);
// 当为String时,判断String长度是否符合注解
if (value instanceof String) {
String s = (String) value;
// 判断值是否满足@Range的min/max:
if (s.length() < range.min() || s.length() > range.max()) {
//不满足抛出异常
throw new IllegalArgumentException("Invalid field: " + field.getName());
}
}
// 当为Integer时,判断Integer是否符合注解范围
if (value instanceof Integer) {
Integer i = (Integer) value;
// 判断值是否满足@Range的min/max:
if (i < range.min() || i> range.max()) {
//不满足抛出异常
throw new IllegalArgumentException("Invalid field: " + field.getName());
}
}
}
}
}