该笔记是基于 Java SE 5
Java 内置注解
- @Override:表示当前方法定义将覆盖超类的方法
- @Deprecated:表示不赞成使用该元素
- @SuppressWarnings:关闭编译器警告
基本语法
元注解
元注解用来创建新注解,Java 有四个元注解
@Target, 用来表示该注解用在什么地方,其参数为:
- ElementType.CONSTRUCTOR:构造器声明
- ElementType.FIELD:域声明,包括 enum 实例
- ElementType.LOCAL_VARIABLE:局部变量声明
- ElementType.METHOD:方法声明
- ElementType.PACKAGE:包声明
- ElementType.PARAMETER:参数声明
- ElementType.TYPE:类,接口,注解,enum 声明
@Retention:表示在什么级别保存该注解类型
- RetentionPolicy.SOURCE:注解将被编译器丢弃
- RetentionPolicy.CLASS:注解在 class 文件中可用,但会被 VM 丢弃
- RetentionPolicy.RUNTIME:VM 将在运行期间也保留注解,可以通过反射机制获取注解信息
@Documented:该注解包含在 JavaDoc 中,默认情况下注解是不会被包含在 JavaDoc 中。
@Inherited,允许子类继承父类中的注解
声明注解
注解的声明类似于接口声明,注解中的元素以方法的形式声明。
以下是约束注解的示例,它接受三个boolean
值。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
boolean primaryKey() default false;
boolean allowNull() default true;
boolean unique() default false;
}
注解中的元素只允许使用以下类型:
- 所有的基本类型
- String
- Class
- enum
- Annotation,注解
- 以上类型的数组
默认值限制
注解不允许有不确定的值,要么具有默认值,要么在注解时指定值,另外不允许以 null 作为元素的值。
编写注解处理器
如果不编写注解处理器,注解基本上就没用。注解处理器通过Java的反射机制创建。
public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
for (Method m : cl.getDeclaredMethods()) {
UseCase uc = m.getAnnotation(UseCase.class);
if (uc != null) {
System.out.println("Found Use Case:" + uc.id() + " " + uc.description());
useCases.remove(new Integer(uc.id()));
}
System.out.println(m.getName());
}
for (int i : useCases) {
System.out.println("Warning :Missing use case-" + i);
}
}
//getAnnotation()方法获取指定类型的注解。