一、java自身的注解
@Deprecated 表明当前的元素已经不推荐使用
@Override 表明当前方法是覆盖了父类方法
@SuppressWarnings 关闭编译器警告信息
二、自定义注解
接口声明
1 @Target(ElementType.METHOD)2 @Retention(RetentionPolicy.RUNTIME)3 public @interfaceMyMethodAnnotation {4
5 }
使用自定义注解
1 public classAnnotationDemo {2
3 @MyMethodAnnotation4 public voidtest() {5
6 }7
8 @MyMethodAnnotation9 public voidtest2() {10
11 }12
13 public voidtest3() {14
15 }16 }
测试
1 public classClient {2
3 public static voidmain(String[] args) {4 Method[] methods = AnnotationDemo.class.getMethods();5 for(Method m : methods) {6 if(m.isAnnotationPresent(MyMethodAnnotation.class)) {7 System.out.println("----- " + m.getName() + " -------");8 }9 }10 }11 }
结果
----- test -------
----- test2 -------
三、元注解
作用负责注解其它注解
@Target
@Retention
@Documented
@Inherited
1、@Target : 描述注解的使用范围
取值(ElementType)有,
public enumElementType {/**Class, interface (including annotation type), or enum declaration*/TYPE, // 用于描述类、接口(包括注解类型) 或enum声明/**Field declaration (includes enum constants)*/FIELD, // 用于描述域/**Method declaration*/METHOD, // 用于描述方法/**Parameter declaration*/PARAMETER, // 用于描述参数/**Constructor declaration*/CONSTRUCTOR, // 用于描述构造函数/**Local variable declaration*/LOCAL_VARIABLE, // 用于描述局部变量/**Annotation type declaration*/ANNOTATION_TYPE,/**Package declaration*/PACKAGE // 用于描述包
}
2、@Retention : 描述注解的生命周期
public enumRetentionPolicy {/*** Annotations are to be discarded by the compiler.*/SOURCE, //在源文件有效 保留在源文件/*** Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.*/CLASS, //在class文件有效 保留在class文件/*** Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
*@seejava.lang.reflect.AnnotatedElement*/RUNTIME //在运行时有效 运行时保留
}
3、@Documented : 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化
4、@Inherited :阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
四、启示
想想,自定义注解还是有很多好处的。junit测试框架,方法上注解@Test,@Before, @After。没看过它的底层实现,不过仔细想想,无非也是通过运行期反射去拿到定义在方法的注解,
根据不同注解类型,来执行不同的操作。