注解,顾名思义就是对某种事物添加一个注释说明的意思,标注某种事物的特征以及形态,供日后其它人遇到该事物时有一个直观的认识。JAVA注解又叫JAVA标注,JAVA语言提供一套机制,可以在包、类(包括接口、枚举、注解)、方法、字段(包括常量)、方法参数、局部变量、构造器和注解这些元素上添加标注(即为这些元素附上一些标识信息),在某些业务需要的情况下,可以通过JAVA的反射机制获得这些元素的标识信息,做进一步的操作。
/* * JDK自带的元注解有:@Target,@Retentio,@Documente,@Inherited * * @Target:指示该注解类型用于什么元素之上,如果注解没有添加@Target标示,则可以作用于任一程序元素上,如果加上了@Target注解类型约束,则编译器会强制检查作用于程序元素上的限制。 * 可选的ElementType注解类型包括: * ElementType.ANNOTATION_TYPE:只能作用于注解类型上 * ElementType.CONSTRUCTOR:只能作用于构造方法上 * ElementType.FIELD:只能作用于字段上(包括枚举常量) * ElementType.LOCAL_VARIABLE:只能作用于局部变量上 * ElementType.METHOD:只能作用于方法上 * ElementType.PACKAGE:只能作用于包上 * ElementType.PARAMETER:只能作用于方法参数声明上 * ElementType.TYPE:只能作于类、接口、枚举、注解上 * * @Retention:指示在什么级别保留注解信息。如果注释类型声明中不存在Retention,则保留策略默认为 RetentionPolicy.CLASS。 * 可选的RetentionPolicy保留级别包括: * RetentionPolicy.SOURCE:仅保留在源代码中,javac编译完后,会丢弃注解。不会保存在编译好的class文件上。 * RetentionPolicy.CLASS:保留在源代码和class文件中,jvm加载class字节码文件时,不会加载注解。 * RetentionPolicy.RUNTIME:即保留在源代码和class文件中,也会被jvm加载到内存当中,所以可通过反射的方式读取注解信息。 * * @Documented:标示了此注解的元素,注释将成为注解元素公共API的一部分。 * * @Inherited:指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。 */
package annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) //此注解会一直保留到运行时 @Target(ElementType.TYPE) //此注解应用于类、接口、枚举、注解上 @Documented //此注解会包含在javadoc中 public @interface TypeAnnotation { String value(); }
package annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface MethodAnnotation { String name(); String address(); }
package annotation; @TypeAnnotation("hi,i am TypeAnnotation...") public class AnnotationResource { @MethodAnnotation(name="zhangsan",address="北京") public void getPersonInfo() { System.out.println("hello,i am zhangsan"); } @MethodAnnotation(name="lisi",address="上海") public String getPersonInfo2() { return "lisi,来自上海!"; } }
package annotation; import java.lang.reflect.Method; /** * 测试注解的使用 */ public class TestAnnotation { public static void main(String[] args) { AnnotationResource ar = new AnnotationResource(); Class clazz = ar.getClass(); //通过反射获得类注解信息 if (clazz.isAnnotationPresent(TypeAnnotation.class)) { TypeAnnotation typeAnnotation = (TypeAnnotation) clazz.getAnnotation(TypeAnnotation.class); System.out.println(typeAnnotation.value()); } //通过反射获得方法注解信息 Method[] methods = clazz.getMethods(); for (Method method : methods) { if (method.isAnnotationPresent(MethodAnnotation.class)) { MethodAnnotation methodAnnotation = method.getAnnotation(MethodAnnotation.class); System.out.print("姓名:" + methodAnnotation.name() + "\t"); System.out.println("地址:" + methodAnnotation.address() + "\t"); } } } }