《Java+Annotation详解PPT优秀课件》由会员分享,可在线阅读,更多相关《Java+Annotation详解PPT优秀课件(25页珍藏版)》请在金锄头文库上搜索。
1、浪 曦 视 频 在 线Java Annotation详解讲师:风中叶版 权 归 浪 曦 视 频 在 线 所 有浪曦视频在线http:/概 述掌握掌握Java Annotation特性与使用方式特性与使用方式Annotation的由来Annotation的定义方式Annotation的使用方式JDK5内建Annotation详解Annotation高级特性2浪曦视频在线http:/为什么使用Annotation在JAVA应用中,我们常遇到一些需要使用模版代码的情况。例如,为了编写一个 web service,我们必须提供一对接口和实现作为模版代码。如果使用annotation对远程访问的方法代码
2、进行修饰的话,这个模版就能够使用工具自动生成。另外,一些API需要使用与程序代码同时维护的附属文件。例如EJB需要一个部署描述符。此时在程序中使用annotation来维护这些附属文件的信息将十分便利而且减少了错误。浪曦视频在线http:/Annotation工作方式从从Java5.0Java5.0版发布以来,版发布以来,5.05.0平台提供了一个正式的平台提供了一个正式的annotationannotation功功能:允许开发者定义、使用自己的能:允许开发者定义、使用自己的annotationannotation类型。此功能由一类型。此功能由一个定义个定义annotationannotati
3、on类型的语法和一个描述类型的语法和一个描述annotationannotation声明的语法,声明的语法,读取读取annotationannotation的的APIAPI,一个使用,一个使用annotationannotation修饰的修饰的classclass文件,文件,一个一个annotationannotation处理工具(处理工具(aptapt)组成。)组成。浪曦视频在线http:/Annotation工作方式annotationannotation并不直接影响代码语义,但是它能够工作的方式被看作类并不直接影响代码语义,但是它能够工作的方式被看作类似程序的工具或者类库,它会反过来对正
4、在运行的程序语义有所影响。似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。annotationannotation可以从源文件、可以从源文件、classclass文件或者以在运行时反射的多种方文件或者以在运行时反射的多种方式被读取。式被读取。当然当然annotationannotation在某种程度上使在某种程度上使javadoc tagjavadoc tag更加完整。一般情况下,更加完整。一般情况下,如果这个标记对如果这个标记对javajava文档产生影响或者用于生成文档产生影响或者用于生成javajava文档的话,它应文档的话,它应该作为一个该作为一个javadoc tagj
5、avadoc tag;否则将作为一个;否则将作为一个annotationannotation。5浪曦视频在线http:/使用JDK5内建Annotation参见程序实例参见程序实例OverrideOverrideDeprecatedDeprecatedSuppressWarningsSuppressWarnings6浪曦视频在线http:/限定Override父类方法Overridejava.lang.Overridejava.lang.Override是个是个Marker annotationMarker annotation用于标示的用于标示的AnnotationAnnotation,An
6、notationAnnotation名称本身即表示了要给工具程序名称本身即表示了要给工具程序的信息的信息7浪曦视频在线http:/标示方法為Deprecated Deprectated对编译程序说明某个方法已经不建议使用对编译程序说明某个方法已经不建议使用, ,即该方法是过时的。即该方法是过时的。java.lang.Deprecatedjava.lang.Deprecated也是個也是個Marker annotationMarker annotationDeprecatedDeprecated这个名称在告知编译程序,被这个名称在告知编译程序,被DeprecatedDeprecated标示的方法
7、是标示的方法是一个不建议被使用的方法一个不建议被使用的方法8浪曦视频在线http:/抑制编译程序警告SuppressWarnings对编译程序说明某个方法中若有警告讯息,则加以抑制对编译程序说明某个方法中若有警告讯息,则加以抑制9浪曦视频在线http:/自定义Annotation类型定义定义Marker AnnotationMarker Annotation,也就是,也就是AnnotationAnnotation名称本身即提供信息名称本身即提供信息对于程序分析工具来说,主要是检查是否对于程序分析工具来说,主要是检查是否有有MarkerAnnotationMarkerAnnotation的出现,
8、的出现,并作出对应的动作并作出对应的动作参见程序范例参见程序范例10浪曦视频在线http:/Single-value annotationvaluevalue成员设定默认值,用成员设定默认值,用defaultdefault关键词关键词数组方式的使用数组方式的使用枚举在枚举在AnnotationAnnotation中的应用中的应用11浪曦视频在线http:/自定义Annotation类型使用使用interfaceinterface自行定义自行定义AnnotationAnnotation型态时,实际上是自动继承了型态时,实际上是自动继承了java.lang.annotation.Annotatio
9、njava.lang.annotation.Annotation接口接口由编译程序自动为您完成其它产生的细节由编译程序自动为您完成其它产生的细节在定义在定义AnnotationAnnotation型态时,不能继承其它的型态时,不能继承其它的AnnotationAnnotation型态或是接口型态或是接口12浪曦视频在线http:/自定义Annotation类型定义定义AnnotationAnnotation型态时也可以使用包来管理类别型态时也可以使用包来管理类别方式类同于类的导入功能方式类同于类的导入功能13浪曦视频在线http:/告知编译程序如何处理Retentionjava.lang.an
10、notation.Retentionjava.lang.annotation.Retention型态可以在您定义型态可以在您定义AnnotationAnnotation型态型态时,指示编译程序该如何对待您的自定义的时,指示编译程序该如何对待您的自定义的AnnotationAnnotation型态型态预设上编译程序会将预设上编译程序会将AnnotationAnnotation信息留在信息留在.class.class档案中档案中,但不被虚拟,但不被虚拟机读取,而仅用于编译程序或工具程序运行时提供信息机读取,而仅用于编译程序或工具程序运行时提供信息浪曦视频在线http:/告知编译程序如何处理Rete
11、ntion在使用在使用RetentionRetention型态时,需要提供型态时,需要提供java.lang.annotation.RetentionPolicyjava.lang.annotation.RetentionPolicy的的枚举枚举型态型态package java.lang.annotation;package java.lang.annotation;public enum RetentionPolicypublic enum RetentionPolicy SOURCE, / SOURCE, /编译程序处理完编译程序处理完AnnotationAnnotation信息后就完成任
12、务信息后就完成任务 CLASS, /CLASS, /编译程序将编译程序将AnnotationAnnotation储存于储存于classclass档中,档中,缺省缺省 RUNTIME /RUNTIME /编译程序将编译程序将AnnotationAnnotation储存于储存于classclass檔中,可由檔中,可由VMVM读入读入 15浪曦视频在线http:/告知编译程序如何处理RetentionRetentionPolicyRetentionPolicy为为SOURCESOURCE的例子是的例子是SuppressWarningsSuppressWarnings仅在编译时期告知编译程序来抑制警告
13、,所以不必将这个信息储存于仅在编译时期告知编译程序来抑制警告,所以不必将这个信息储存于.class.class档案档案RetentionPolicyRetentionPolicy为为RUNTIMERUNTIME的时机,可以像是您使用的时机,可以像是您使用JavaJava设计一个程设计一个程序代码分析工具,您必须让序代码分析工具,您必须让VMVM能读出能读出AnnotationAnnotation信息,以便在分析程信息,以便在分析程序时使用序时使用搭配反射(搭配反射(ReflectionReflection)机制,就可以达到这个目的)机制,就可以达到这个目的16浪曦视频在线http:/告知编译程
14、序如何处理Retentionjava.lang.reflect.AnnotatedElementjava.lang.reflect.AnnotatedElement接口接口public Annotation getAnnotation(Class annotationType);public Annotation getAnnotation(Class annotationType);public Annotation getAnnotations();public Annotation getAnnotations();public Annotation getDeclaredAnnotat
15、ions();public Annotation getDeclaredAnnotations();public boolean isAnnotationPresent(Class annotationType);public boolean isAnnotationPresent(Class annotationType);ClassClass、ConstructorConstructor、FieldField、MethodMethod、PackagePackage等类别,都实现了等类别,都实现了AnnotatedElementAnnotatedElement接口接口17浪曦视频在线http
16、:/告知编译程序如何处理Retention定义定义AnnotationAnnotation时必须设定时必须设定RetentionPolicyRetentionPolicy为为RUNTIMERUNTIME,也就是可以,也就是可以在在VMVM中读取中读取AnnotationAnnotation信息信息参见程序参见程序18浪曦视频在线http:/限定annotation使用对象Target使用使用java.lang.annotation.Targetjava.lang.annotation.Target可以定义其使用之时机可以定义其使用之时机在定义时要指定在定义时要指定java.lang.annot
17、ation.ElementTypejava.lang.annotation.ElementType的枚举值之一的枚举值之一19浪曦视频在线http:/限定annotation使用对象Targetpackage java.lang.annotation;public enum ElementType TYPE, /适用class, interface, enum FIELD, /适用field METHOD, /适用method PARAMETER, /适用method上之parameter CONSTRUCTOR, /适用constructor LOCAL_VARIABLE, /适用局部变量
18、ANNOTATION_TYPE, /适用annotation型态 PACKAGE /适用package参见范例20浪曦视频在线http:/要求为API文件Documented想要在使用者制作想要在使用者制作JavaDocJavaDoc文件的同时,也一并将文件的同时,也一并将AnnotationAnnotation的讯息的讯息加入至加入至APIAPI文件中文件中使用使用java.lang.annotation.Documentedjava.lang.annotation.Documented21浪曦视频在线http:/子类是否继承父类Inherited预设上父类别中的预设上父类别中的AnnotationAnnotation并不会被继承至子类别中并不会被继承至子类别中可以在定义可以在定义AnnotationAnnotation型态时加上型态时加上java.lang.annotation.Inheritedjava.lang.annotation.Inherited型态的型态的AnnotationAnnotation22浪曦视频在线http:/子类是否继承父类Inherited事实上,事实上,InheratedInherated在在JDK5JDK5中还没有发生作用中还没有发生作用23浪 曦 视 频 在 线感谢您对浪曦的支持http:/个人观点供参考,欢迎讨论