注解
什么是注解
注解Annotation是一种元数据形式。属于java中的一种数据类型,其地位和类、接口、数组、枚举这些都是一样的。
但是其书写的位置被固定为类、方注解Annotation是书写在iava代码中的,法、变量、参数的前面。
注解Annotation不会改变程序的操作,因此没有改变程序的语义。然而在开发和配置期间。注解信息可以在运行期进行获取。
注解不是注释
注释是对代码的解释和说明,其目的是提高程序代码的可读性注释只存在于java源代码中,对于编译和运行没有任何作用
注解语法支持两种注解
- JDK 自带的Annotation注解
- 开发者自定义Annotation注解
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告,用于抑制编译器警告。指示被@SuppressWarnings修饰的程序元素(以及该程序元素中的所有子元素,例如类以及该类中的方法…)消显示的编译器警告。
关键字 被抑制的警告类型
all 抑制所有警告
deprecation 抑制使用了过时的类或方法的警告
fallthrough 抑制switch块中没有break语句的警告
fnally 抑制fnally块不能正常完成的警告
rawtypes 抑制没有使用泛型的警告
serial 抑制可序列化类没有使用序列化ID的警告
unchecked 抑制未检查操作的警告
unused 抑制变量或方法申明定义后未使用的警告
自定义注解
第一步 :定义注解------相当于定义标记
第二步:配置注解-------把标记打在需要用到的程序代码中
第三步:解析注解------在编译期或运行时检测到标记,并进行特殊操作
自定义注解
定义注解使用关键字@interface
public @interface LovoAnnotation {}
注解本质是一种特殊的接口,在底层实现上,所定义的注解都会自动继承java.lang,annotation.Annotation
注解在实现部分只能定义:注解类型元素
public @interface LovoAnnotation {
public String name()
int age()
int [] array()
}
注解定义好了后,使用操作是元素类型像在操作属性一样
注解类型元素说明
1.注解元素的访问修饰符只能是public,不写也是默认public
2.注解元素的类型只能是基本数据类型、string、class、注解类型、枚举类型、以及上面这几种的一维数组
3.注解元素的名字应该为名词形式。如果一个注解中只有一个类型元素,请把名字起成value,方便后面操作
4.()不是定义方法参数列表的地方,也不能在括号中定义任何参数,就是个特殊的语法。
5、default代表默认值,值必须和该注解元素的类型一致
6、如果没有默认值,代表后面使用时必须给该类型元素赋值。
常用的元注解
元注解是专门修饰注解的注解,是为了更好的设计自定义注解的细节而专门设计的。
@Target
@Target注解,是专门用来限定某个自定义注解能被应用到Java代码的那些位置
枚举值 | 注解能够被应用的地方 |
---|---|
ElementType.ANNOTATION TYPE | 注解类型的声明 |
ElementType.CONSTRUCTOR | 构造方法的声明 |
ElementType.FIELD | 属性的声明 |
ElementType.LOCAL VARIABLE | 局部变量的声明 |
ElementType.METHOD | 方法的声明 |
ElementType.PACKAGE | 包的声明 |
ElementType.PARAMETER | 方法参数的声明 |
ElementType.TYPE | 类、接口以及枚举的声明 |
@Retention
@Retention注解,是用来限定某个自定义注解的生命力
注解的生命周期三种情况
1.仅存在java源文件中
2.被编译到class文件中
3.运行期被加载到class对象中
@Retention注解使用一个枚举类型RetentionPolicy定义三个选择
RetentionPolicy.SOURCE
该注解被限定在Java源文件中,该注解不会参与译也不会在运行期起任何作用。只能在源文件中可见,和注释没什么区别。
RetentionPolicy.CLASS
该注解被编译到class文件中,编译器可以在编译时根据注解做一些处理动作,但运行时,jvm会忽略它,在运行期也不能读取到。
RetentionPolicy.RUNTIME
该注解可以在运行期的加载阶段被加载到class对象中,在程序运行阶段,可以通过反射得到该注解,并通过判断是否有这个注解或这个注解中的属性的值,从而执行不同的程序代码段,实际开发中的自定义注解,几乎都使用RetentionPolicy.RUNTIME。
常用的元注解
@Documented
@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到javadoc文档中。
@lnherited
@inherited注解,是指定某个自定义注解如果写在了父类的声明部分那么子类的声明部分也能自动拥有该注解。该注解生效与@Target被定义为ElementType.TYPE的情形。
注解Annotation的特殊语法
1.如果注解本身没有定义注解类型元素,那么在使用注解时可以省略()
2.如果注解本身在其内部只定义了一个注解类型元素,并命名为value,那么在使用注解时,可以直接书写为@注解名(注解值),它的标准写法(value = 注解值)等效
@Target(ElementType.TYPE
3.如果注解中的某个注解类型元素是一个数组类型,在使用时只需要填入一个值,那么,在使用注解时,可以直接书写为@注解名=类型值)它和标准书写法@注解名(类型名={类型值})等效。
@Target(ElementType. TYPE)
@Retention(RetentionPolicy.RUNTIME)public
@interface SpecialAnnotation{
fString[] addresses();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialAnnotation {
String[] addresses();
}
@SpecialAnnotation(addresses=“NYC”)
public class SomeBean {
}
4.如果一个注解的@Target定义为Element.PARAMETER ,那么这个注解是配置在方法的形参前面的
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialAnnotation {
String param();
}
public class SomeBean {
public void speak(
@SpecialAnnotation(param="name") String useName){
}}
注解和XML的比较
SQML(标准通用标记语言)的一个子集。XML是一种独立的文本格式,语法能够很丰富的表达各种数据结构。所以又被大量用来作为不同平台之间数据传递的标准格式,它的使用越来越广泛,包括WebService、AJAX等都是基于它的,所以配置文件只是XML的一种用途而已。注解是Java在JDK1.5中提供的一种新类型。它是在Java代码中的特殊标记,这些标记可以在编译、类加载或运行期被读取,从而执行相应的特殊操作。所以,注解Annotation是Java语言独有的,只能Java用,并且其设计目的就是为了做配置的。XML用途比Java注解要广泛得多,它不限语言,只要需要表示数据的地方都可以使用,这是Java注解绝对不可比拟的。所以,JAVA注解要替代XML是不可能的。
XML配置优点
1.可扩展性强,XML和它的定义文件(DTD)是文本文件,添加或修改都很方便
2.满足开闭性原则,XML的配置文件是独立于JAVA代码之外的,所以如果要修改配置是不需要改动JAVA代码的
缺点:1、解析麻烦,需要第三方类库配合
2、配置文件过多后,会导致项目管理、维护变得困难。
3、在做代码的关联配置时麻烦,会让开发人员不断在java代码和XML配置文件之间来回切换。
4、查错困难,XML只是文本文件,很多报错只能在运行期间体现,IDE集成开发环境不能在编译期排查。
注解配置的优点
1.JDK自带反射方式解析,不引入第三方库
2.直接配置在java源代码中,所以不会引入额外的配置文件,项目管理和维护变简单
3.无论是定义、配置还是解析都是java代码,所以不存在配置时需要在不同语法格式中切换的问题
4.IDE支持度高,排查错误方便,提高开发效率
缺点:
1.任何对配置、对定义的修改都需要改动java代码,然后重新编译,重新打包应用
2.不是通用标准,只能在java中使用。
XML和注解配置的使用场景
XML与注解在配置这个应用场景中互补性是非常高的,XML的缺点就是注解的优点,反之亦然,这也是目前在javaEE的各大框架中XML+Annotation配置流的原因。
一般来说,把与代码关联不高,并改动可能性大的配置写在XML文件中,专门配置java怠慢级别关联度,以后改动度小的则使用注解Annotation