注解
什么是注解?为什么需要注解?
用来将任何的信息或元数据与程序元素(类、方法、成员变量等)进行关联。
为程序的元素(类、方法、成员变量)加上更直观更明了的说明,方便后期维护。
用来将任何的信息或元数据与程序元素(类、方法、成员变量等)进行关联。
为程序的元素(类、方法、成员变量)加上更直观更明了的说明,方便后期维护。
注解的用处:
1、生成文档。例如@param @return等
2、跟踪代码依赖性,实现替代配置文件功能。(使用注解配置普通的servlet的映射路径(@WebServlet)过滤器(@WebFilter)监听器(@WebListener))
3、在编译时进行格式检查。如@override放在方法前,如果你这个方法并不是覆写了超类方法,则编译时就能检查出。
1、生成文档。例如@param @return等
2、跟踪代码依赖性,实现替代配置文件功能。(使用注解配置普通的servlet的映射路径(@WebServlet)过滤器(@WebFilter)监听器(@WebListener))
3、在编译时进行格式检查。如@override放在方法前,如果你这个方法并不是覆写了超类方法,则编译时就能检查出。
注解的原理:
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成动态代理类。
而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。
通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成动态代理类。
而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。
通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。
常见标准的Annotation
1.)Override
java.lang.Override是一个标记类型注解,它被用作标注方法。它说明了被标注的方法重载了父类的方法,
起到了断言的作用。如果我们使用了这种注解在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
2.)Deprecated
Deprecated也是一种标记类型注解。当一个类型或者类型成员使用@Deprecated修饰的话,
编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的“延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为@Deprecated,但编译器仍然要报警。
3.)SuppressWarnings
SuppressWarning不是一个标记类型注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。
对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
@SuppressWarnings("unchecked")
1.)Override
java.lang.Override是一个标记类型注解,它被用作标注方法。它说明了被标注的方法重载了父类的方法,
起到了断言的作用。如果我们使用了这种注解在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
2.)Deprecated
Deprecated也是一种标记类型注解。当一个类型或者类型成员使用@Deprecated修饰的话,
编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的“延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为@Deprecated,但编译器仍然要报警。
3.)SuppressWarnings
SuppressWarning不是一个标记类型注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。
对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
@SuppressWarnings("unchecked")
自定义注解:
自定义注解类编写的一些规则:
1、Annotation类定义为@interface,所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或者接口。
2、参数成员只能用public或默认(default)这两个访问权修饰
3、参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型
和String、Enum、Class、Annotations等数据类型,以及这一些类型的数组。
4、要获取类方法和字段的注解信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法
5、注解也可以没有定义成员,不过这样注解就没啥用了
PS:自定义注解需要使用到元注解
自定义注解类编写的一些规则:
1、Annotation类定义为@interface,所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或者接口。
2、参数成员只能用public或默认(default)这两个访问权修饰
3、参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型
和String、Enum、Class、Annotations等数据类型,以及这一些类型的数组。
4、要获取类方法和字段的注解信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法
5、注解也可以没有定义成员,不过这样注解就没啥用了
PS:自定义注解需要使用到元注解