注解是一种特殊的接口,为了把注解类型和普通接口类型区分开我们在interface前面添加@符号。
注解其实就在在代码上面添加Tag,注解并不会影响程序的运行。
注解是一种配置机制。
Think in Java中是这样定义注解的:
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。
JavaSE5内置了三种注解,定义在java.lang中:
- @Override,表示当前的方法定义将覆盖超类中的方法。
- @Deprecated,表示它注解的元素不推荐使用了,因为它是危险的或者有了更好的实现。
- @SuppressWarnings,关闭不当的编译器警告信息。
@Target | 表示该注解用于什么地方,可能的ElementType参数有: TYPE: 类,接口(包括注解类)或enum声明 FIELD:域声明(包括enum实例) METHOD:方法声明 PARAMETER:参数声明 CONSTRUCTOR:构造器声明 LOCAL_VARIABLE:局部变量声明 ANNOTATION_TYPE:注解类型声明 PACKAGE:包声明 |
@Retention | 表示需要在什么级别保存该注解信息,可选的RetentionPolicy参数包括: SOURCE:注解将被编译器丢弃 CLASS:注解在class文件中可用,但会被VM丢弃 RUNTIME:VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息 |
@Documented | 将此注解包含在Javadoc中 |
@Inherited | 允许子类继承父类中的注解 |
简单的自定义注解:
package com.dusk.annoation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
public int id();
public String description() default "no description";
}
注解元素的可用类型有:
- 所有的基本类型
- String
- Class
- enum
- Annotation
- 以上类型的数组
操作注解:
注解其实就是类、枚举、方法、类属性上面的一个标记,只要我们能读到这个标记就可以根据自己的实际应用场景进行相应的处理。
最基础的办法是我们使用Java反射包中自带的获取注解的方法来处理。
例如:
类:
java.lang.Class.getAnnotation(Class<A>)
java.lang.Class.getDeclaredAnnotations()
方法:
java.lang.reflect.Method.getAnnotation(Class<T>)
属性:
java.lang.reflect.Field.getAnnotation(Class<T>)
当然也可以使用apt , javac等