欢迎光临北大青鸟华大软件校区

我的位置: 首页 >>Java Annotation 必须掌握的特性

Java Annotation 必须掌握的特性

2017-06-14

来源:

  Java Annotation 必须掌握的特性

  什么是Annotation?

  Annotation翻译为中文即为注解,意思就是提供除了程序本身逻辑外的额外的数据信息。Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互,但其他组件可以使用这些信息。

  Annotation信息可以被编译进class文件,也可以保留在Java 虚拟机中,从而在运行时可以获取。甚至对于Annotation本身也可以加Annotation。

  那些对象可以加Annotation

  类,方法,变量,参数,包都可以加Annotation。

  内置的Annotation

  @Override 重载父类中方法 @Deprecated 被标注的方法或类型已不再推荐使用

  @SuppressWarnings 阻止编译时的警告信息。其需要接收一个String的数组作为参数。 可供使用的参数有:

  unchecked

  path

  serial

  finally

  fallthrough

  可以用与其他annotation上的annotation

  @Retention

  确定Annotation被保存的生命周期, 需要接收一个Enum对象RetentionPolicy作为参数。

  public enum RetentionPolicy { ? ?/** ? ? * Annotations are to be discarded by the compiler. ? ? */ ? ?SOURCE, ? ?/** ? ? * Annotations are to be recorded in the class file by the compiler ? ? * but need not be retained by the VM at run time. ?This is the default ? ? * behavior. ? ? */ ? ?CLASS, ? ?/** ? ? * Annotations are to be recorded in the class file by the compiler and ? ? * retained by the VM at run time, so they may be read reflectively. ? ? * ? ? * @see java.lang.reflect.AnnotatedElement ? ? */ ? ?RUNTIME}

  @Documented 文档化

  @Target

  表示该Annotation可以修饰的范围,接收一个Enum对象EnumType的数组作为参数。

  public enum ElementType { ? ?/** Class, interface (including annotation type), or enum declaration */ ? ?TYPE, ? ?/** Field declaration (includes enum constants) */ ? ?FIELD, ? ?/** Method declaration */ ? ?METHOD, ? ?/** Parameter declaration */ ? ?PARAMETER, ? ?/** Constructor declaration */ ? ?CONSTRUCTOR, ? ?/** Local variable declaration */ ? ?LOCAL_VARIABLE, ? ?/** Annotation type declaration */ ? ?ANNOTATION_TYPE, ? ?/** Package declaration */ ? ?PACKAGE}

  @Inherited

  该Annotation可以影响到被标注的类的子类。

  自定义Annotation

  JSE5.0以后我们可以自定义Annotation。下面就是一个简单的例子。

  @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface MethodAnnotation {}

  下面的Person对象使用了自定义的MethodAnnotation。

  public class Person { ? ?public void eat() { ? ? ? ?System.out.println(eating); ? ?} ? ?@MethodAnnotation ? ?public void walk() { ? ? ? ?System.out.print(walking); ? ?}}

  我们可以通过反射获取Annotation的信息。

  Class personClass = Person.class; ? ? ? ?Method[] methods = personClass.getMethods(); ? ? ? ?for(Method method : methods){ ? ? ? ? ? ?if (method.isAnnotationPresent(MethodAnnotation.class)){ ? ? ? ? ? ? ? ?method.invoke(personClass.newInstance()); ? ? ? ? ? ?} ? ? ? ?}

  输出:

  walking

  我们也可以给自定义的Annotation加方法。

  @Target(ElementType.TYPE)public @interface personAnnotation { ? ?int id() default 1; ? ?String name() default bowen;}

  下面是对personAnnotation的使用。

  @personAnnotation(id = 8, name = john)public class Person { ? ?public void eat() { ? ? ? ?System.out.println(eating); ? ?} ? ?@MethodAnnotation ? ?public void walk() { ? ? ? ?System.out.print(walking); ? ?}}

  Annotation是如何被处理的

  当Java源代码被编译时,编译器的一个插件annotation处理器则会处理这些annotation。处理器可以产生报告信息,或者创建附加的Java源文件或资源。如果annotation本身被加上了RententionPolicy的运行时类,则Java编译器则会将annotation的元数据存储到class文件中。然后,Java虚拟机或其他的程序可以查找这些元数据并做相应的处理。

  当然除了annotation处理器可以处理annotation外,我们也可以使用反射自己来处理annotation。Java SE 5有一个名为AnnotatedElement的接口,Java的反射对象类Class,Constructor,Field,Method以及Package都实现了这个接口。这个接口用来表示当前运行在Java虚拟机中的被加上了annotation的程序元素。通过这个接口可以使用反射读取annotation。AnnotatedElement接口可以访问被加上RUNTIME标记的annotation,相应的方法有getAnnotation,getAnnotations,isAnnotationPresent。由于Annotation类型被编译和存储在二进制文件中就像class一样,所以可以像查询普通的Java对象一样查询这些方法返回的Annotation。

  Annotation的广泛使用

  Annotation被广泛用于各种框架和库中,下面就列举一些典型的应用.

  Junit

  Junit是非常着名的一款单元测试框架,使用Junit的时候需要接触大量的annotation。

<

相关热词搜索:北大青鸟北大青鸟

开班信息

开班课程 人数 了解详情
名企定向委培班 剩余名额3 课程介绍
ACCP8.0软件培训班 剩余名额8 课程介绍
短期冲刺班 剩余名额2 课程介绍
项目精英班 剩余名额1 课程介绍
NET课程重点班 剩余名额6 课程介绍
软件开发精英班 剩余名额2 课程介绍
JAVA特招班 剩余名额10 课程介绍

免费试听

试听课程 了解详情
名企定向委培班 试听详情
ACCP8.0软件培训班 试听详情
短期冲刺班 试听详情
项目精英班 试听详情
NET课程重点班 试听详情
软件开发精英班 试听详情
JAVA特招班 试听详情

姓名:

电话:

最新就业

姓名 就业岗位 就业企业
何伟煊 java工程师 金政信息科技
张雅涵 NET工程师 国贸集团股份有限公司
张默 项目组长 极宇舟天有限公司
张婧涵 NET工程师 大族激光有限公司
张洪文 运维工程师 诚迈科技有限公司
王玥婷 java技术顾问岗位 百纳威尔有限公司
王鸿轩 Java开发岗位 爱卡智能
邓安志 软件开发工程师 美的集团
何浚宏 软件开发课程工程师 东和科技有限公司
黄隆 软件开发顾问 建发股份公司
刘应琴 软件开发工程师 国美集团
刘雨林 java工程师 唯品会科技有限公司
彭子昂 Java开发 爱卡智能有限公司

在线答疑更多++

热门专题更多++

华大校区地址:佛山市禅城区佛山大道北143号

电话:400-966-9387? ?0757-88726000

北大青鸟华大软件校区

?未标题-1