欢迎光临北大青鸟福州新生代校区

  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。

<

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

2018-08-14

来源:


 

在线答疑更多++

热门专题更多++

福建省福州市鼓楼区东大路恒裕大厦北大青鸟新生代校区

地址:福建省福州市鼓楼区东大路恒裕大厦三楼

电话:400-9966-370   0591-87880522

网址: www.0591bdqn.com

福州校区乘车路线:塔头站、东水路口站、八方大厦站

北大青鸟福州新生代校区公众平台

福州北大青鸟