元注解有以下几种:
@Target 表示该注解用于什么地方。
@Retention表示要在什么级别保存该注解。
@Documented 将此注解包含在JavaDoc中。
@Inherited 允许子类继承父类中的注解。
Java中内置的注解@Override用于SOURCE级别,@SuppressWarnings用于SOURCE级别,@Deprecated用于RUNTIME级别。指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
编写注解类型
下面将用来读取PasswordUtils类,利用反射机制读取UseCase注解。
import java.lang.reflect.*;
import java.lang.annotation.*;
public class PasswordUtils{
@UseCase(id=11,description="test1")
public void test1(){}
public void test2(){}
//description的值用默认的值
@UseCase(id=12)
public void test3(){}
@UseCase(id=13,description="private")
private void test4(){};
@UseCase(id=14,description="protected")
protected void test5(){};
@UseCase(id=14,description="default")
void test6(){};
public static void trackUseCases(Class<?> clazz){
//利用反射返回对象的一个数组,这些对象反映此Class对象表示
//的类或接口声明的所有方法,包括公共,保护,默认访问和私有方法,但不包括继承的方法。
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods){
//如果指定类型的注释存在于此元素上,则返回 true,
//否则返回 false。此方法主要是为了便于访问标记注释而设计的。
if(m.isAnnotationPresent(UseCase.class)){
UseCase uc = m.getAnnotation(UseCase.class);
System.out.println("Method Name:" + m.getName() + " id:" + uc.id()
+ " decription:" + uc.description());
}
}
}
public static void main(String[] args){
trackUseCases(PasswordUtils.class);
}
}
注意:如果注解中只有value一个属性,在写注意元素时,value=可以不用写。
注解元素
注解元素可用的类型如下:
所有的基本类型(int ,float,double等)
String
Class
enum
Annotation
以上类型的数组
如果你使用了其他类型编译器就会报错。
public @interface MyAnnotation{
String value();
}
enum AlarmPoints{
START1,START2,LOBBY,OFFICE1,OFFICE2;
}
import java.lang.annotation.*;
//target的参数可以用数组表示
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase{
public int id();
public String description() default "no description";
//class类型
Class clazz();
//枚举类型
AlarmPoints alarmPoints() default AlarmPoints.START1;
//注解类型
MyAnnotation myAnno() default @MyAnnotation("value");
//数组类型
int[] arrAttr() default {1,2,3};
}