注解的学习

注解

什么是注解

注解Annotation是一种元数据形式。属于java中的一种数据类型,其地位和类、接口、数组、枚举这些都是一样的。

但是其书写的位置被固定为类、方注解Annotation是书写在iava代码中的,法、变量、参数的前面。

注解Annotation不会改变程序的操作,因此没有改变程序的语义。然而在开发和配置期间。注解信息可以在运行期进行获取。

注解不是注释

注释是对代码的解释和说明,其目的是提高程序代码的可读性注释只存在于java源代码中,对于编译和运行没有任何作用

注解语法支持两种注解

  1. JDK 自带的Annotation注解
  2. 开发者自定义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

1、XML称为可扩展的标记语言。是一种利用标记和子标记描述数据的文本格式。

2、XML文档由申明、文档类型定义、注释、元素、属性、以及文本等构成。

3、XML的实体可以描述特殊符号和预定义符号,避免解析时的错误。CDATA标记中描述不被解析器解析的文本。

4、满足XML的语法规则的XML文档,称为格式良好的XML。有效的XML,不仅仅要满足XML的语法规则,还要满足DTD和Schema定义的元素规则。

5、XML解析技术有DOM解析、SAX解析两种。其中DOM解析是基于树结构的API,SAX解析是基于事件驱动的API。

6、JAXP是对应用程序隐藏了特定解析器的接口,它提供了访问DOM和SAX实现的抽象层机制。常用的有JDOM和DOM4J。

7、注解Annotation是一种元数据形式,属于java中的一种数据类型。书写的位置被固定为类、方法、变量、参数和包的申明部分。

8、注解Annotation可以用来生成文档,检查代码间依赖关系,帮助编译器作语法检查等。在开发和配置期间,注解信息可以在运行期进行获取。

9、注解语法支持两种注解:JDK自带的Annotation注解,开发者自定义的Annotation注解

10、JDK自带的Annotation注解,常用的有三个@Override(强行检测子类方法是否重写了父类方法)、@Deprecated(标记类或方法是过时的)、@SuppressWarnings(抑制编译器警告。)

11、自定义注解使用关键字@interface。注解本质是一种特殊的接口,在底层实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation。

12、@Target元注解可以限定该注解的应用范围。

13、@Retention注解,是用来限定某个自定义注解的生命力。该注解申明为RetentionPolicy.RUNTIME时,可以在运行期间通过反射的方式获取信息。

14、XML可以是不同的平台进行数据传输的标准格式。注解只能在java中使用,所以,不能完全替代XML。

15、把与代码关联度不高,并且改动可能性大的配置写在XML文件中。专门配置java代码级别关联度的,以后改动度小的则使用注解Annotation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值