标签:
一、概念
Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。
二、分类
1、按照运行机制分:
1)、源码注解:注解只在源码中存在,编译成.class文件就不存在了;
2)、编译时注解:注解在源码和.class文件中都存在(eg:@Override @Deprecated @SuppressWarnings);
3)、运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解(eg:@Autowired)。
2、按照来源分:
1)、来自JDK的注解;
2)、来自第三方的注解;
3)、自定义的注解。
3、元注解:注解的注解
三、自定义注解
1、语法要求
1)、使用@interface关键字定义注解;
2)、成员以无参无异常方式声明;
3)、可以用default为成员指定一个默认值;
4)、成员类型是受限的,合法的类型包括原始类型及String、Class、Annotation、Enumeration;
5)、如果注解只有一个成员,则成员必须取名为value(),在使用时可以忽略成员们和赋值号(=);
6)、注解类可以没有成员,没有成员的注解称为标识注解;
7)、元注解
①、@Target()——表示作用域,包括CONSTRUCTOR-构造方法声明,FIELD——字段声明,LOCAL_VARIABLE——局部变量声明,METHOD——方法声明,PACKAGE——包声明,PARAMETER——参数声明,TYPE——类、接口声明;
②、@Rentention()——表示生命周期,SOURCE——只在源码显示,编译时会丢弃,CLASS——编译时会记录到.class中,运行时忽略,RUNTIME——运行时存在,可以通过反射读取
③、@Inherited()——表示运行子类继承;
④、@Documented——表示生成javadoc时包含注解。
1 package com.annodemo.anno; 2 3 import java.lang.annotation.Documented; 4 import java.lang.annotation.ElementType; 5 import java.lang.annotation.Inherited; 6 import java.lang.annotation.Retention; 7 import java.lang.annotation.RetentionPolicy; 8 import java.lang.annotation.Target; 9 10 @Target({ElementType.METHOD, ElementType.TYPE})//作用范围 11 @Retention(RetentionPolicy.RUNTIME)//有效时间 12 @Inherited//允许子类继承 13 @Documented//生成javadoc时包含注解 14 //以上四行即为元注解 15 public @interface Description { 16 17 String method_1();//成员1 18 19 String method_2();//成员2 20 21 int age() default 18;//指定默认值 22 23 }
2、使用自定义注解
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,<成员名2>=<成员值2>,...);
1 package com.annodemo.anno; 2 3 @Description(method_1="i am class annotation", method_2="haha") 4 public class AnnTest{ 5 6 @Description(method_1="i am method annotation", method_2="hehe") 7 public String name() { 8 return null; 9 } 10 11 public String age() { 12 return null; 13 } 14 15 public String Love() { 16 return null; 17 } 18 19 }
四、解析注解
1、概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
2、实现:
1 package com.annodemo.anno; 2 3 import java.lang.annotation.Annotation; 4 import java.lang.reflect.Method; 5 6 public class ParseAnn { 7 8 public static void main(String[] args) { 9 10 try { 11 //1.使用类加载器加载类 12 Class<?> c = Class.forName("com.annodemo.anno.AnnTest"); 13 //2.找到类上面的注解 14 boolean isExist = c.isAnnotationPresent(Description.class); 15 if(isExist){ 16 //3.拿到注解实例 17 Description d = c.getAnnotation(Description.class); 18 System.out.println(d.method_1()); 19 } 20 //4.找到方法上的注释 21 Method[] ms = c.getMethods(); 22 for(Method m: ms){ 23 boolean isMExist = m.isAnnotationPresent(Description.class); 24 if(isMExist){ 25 Description d = m.getAnnotation(Description.class); 26 System.out.println(d.method_1()); 27 } 28 } 29 //另一种解析方法 30 for(Method m: ms){ 31 Annotation[] as = m.getAnnotations(); 32 for(Annotation a: as){ 33 if(a instanceof Description){ 34 Description d = (Description)a; 35 System.out.println(d.method_1()); 36 } 37 } 38 } 39 } catch (ClassNotFoundException e) { 40 e.printStackTrace(); 41 } 42 43 } 44 45 }
标签:
原文地址:http://www.cnblogs.com/jinjiyese/p/4817645.html