Java中的自定义注解与使用

1
2
3
4
5
6
7
@Documented
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoExample {
String param() default "";
String value() default "";
}

这是一段典型的自定义注解代码。

@Documented表示注解会被javadoc记录,不需要就不写。

@Target(ElementType.ANNOTATION_TYPE)表示注解修饰的对象范围,ANNOTATION_TYPE表示修饰类、接口、Enum,另外还有CONSTRUCTOR修饰构造函数,METHOD修饰方法等。多个需使用{ }并用逗号隔开。

@Retention(RetentionPolicy.RUNTIME)表示注解有效范围,其中RetentionPolicy.RUNTIME为运行时有效(最常用),另外还有RetentionPolicy.SOURCE(编译后无效)和RetentionPolicy.CLASS(编译后有效但运行时无效)。

AnnoExample为注解名,就如同此例中的Retention

这里我们定义了两个注解参数,一个是param,一个是value。
在使用param这个参数时,需要指明参数名,如@AnnoExample(param="xxx"),但是在使用value这个参数时,可以不指明参数名,如@AnnoExample("xxx")

一般通过反射来解析注解。假设此注解的修饰对象为方法,则可以这样使用

1
2
3
4
5
6
7
8
Method[] methods = obj.getClass().getDeclaredMethods();
for (Method method : methods) {
if(method.isAnnotationPresent(AnnoExample.class)) {
AnnoExample annoExample = (AnnoExample)method.getAnnotation(AnnoExample.class);
String param = (String)annoExample.param();
//获取到注解参数的值后就可以做你想做的了
}
}

简单来说就是三个步骤,第一步,判断方法有无注解,第二步,获取方法的注解,第三步,获取注解的参数值。要注意的是,如果有多个注解,需要用数组获取。