Java Annotation 是在JDK1.5之后增添的新特性.
他是用来标识类,构造方法,方法,字段上的一个标记.
根据该标记,来进行特定的处理.
JDK中自带的有三个注解.
@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上。
@SuppressWarnings:表示关闭一些不当的编译器警告信息。
其他的一些都是自定义注解,所有的注解都是隐身的继承于 java.lang.annotation.Annotation.
自定义注解:
自定义注解都是以@interface标注.
在其定义上面有四个注解标注:
@Target
@Retention
@Documented
@Inherited 代码中介绍各个属性的意义
定义:
1 package com.yemaozi.annotation.demo01; 2 3 import java.lang.annotation.Documented; 4 import java.lang.annotation.ElementType; 5 import java.lang.annotation.Retention; 6 import java.lang.annotation.RetentionPolicy; 7 import java.lang.annotation.Target; 8 /** 9 * //@interface 10 * 自定义注解的关节字,java中所有的注解默认. 11 * //@Retention 12 * RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 13 * RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认) 14 * RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息 15 * //@Target 16 * ElemenetType.CONSTRUCTOR 构造器声明。 17 * ElemenetType.FIELD 域声明(包括 enum 实例)。 18 * ElemenetType.LOCAL_VARIABLE 局部变量声明。 19 * ElemenetType.METHOD 方法声明。 20 * ElemenetType.PACKAGE 包声明。 21 * ElemenetType.PARAMETER 参数声明。 22 * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明。 23 * ElemenetType.CONSTRUCTOR 构造器声明。 24 * ElemenetType.FIELD 域声明(包括 enum 实例)。 25 * ElemenetType.LOCAL_VARIABLE 局部变量声明。 26 * ElemenetType.METHOD 方法声明。 27 * ElemenetType.PACKAGE 包声明。 28 * ElemenetType.PARAMETER 参数声明。 29 * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明。 30 * //@Documented 31 * 目的就是将这一Annotation的信息显示在JAVA API文档上,如果没有增加@Documented的话,JAVA API文档上不会显示相关annotation信息 32 * //@Inherited 33 * 允许子类继承父类中的注解 34 * @author yemaozi 35 * 36 */ 37 @Retention(RetentionPolicy.RUNTIME) 38 @Target({ElementType.METHOD, ElementType.TYPE}) 39 @Documented 40 public @interface MyAnnotation { 41 //定义注解属性 42 String value() default "默认值!"; 43 //其他类型都可在此定义.... 44 //... 45 }
使用该注解
import java.lang.reflect.Method; /** * 使用该注解 * @author yemaozi * */ @MyAnnotation(value="在类上使用!") public class MyAnnotationTest { @MyAnnotation(value="在方法上使用!") public void test(){ } public static void main(String[] args) throws Exception { //判断MyAnnotationTest类上是否有@MyAnnotation注解 if(MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){ //获取@MyAnnotaion注解 MyAnnotation anno = MyAnnotationTest.class.getAnnotation(MyAnnotation.class); //获取类注解上的属性值 String value = anno.value(); System.out.println("类上的注解属性值:"+value); } //获取test方法上的注解 //获取test方法 Method method = MyAnnotationTest.class.getMethod("test"); if(method.isAnnotationPresent(MyAnnotation.class)){ MyAnnotation anno = method.getAnnotation(MyAnnotation.class); //获取方法注解上的属性值 String value = anno.value(); System.out.println("方法注解上的属性值:" + value); } } }
输出结果为:
类上的注解属性值:在类上使用!
方法注解上的属性值:在方法上使用!