• 技术文章 >Java >java教程

    详解Java Annotation特性的掌握

    黄舟黄舟2017-03-30 10:51:46原创513

    什么是Annotation?

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

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

    那些对象可以加Annotation

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

    内置的Annotation

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

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

    可以用与其他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<Person> 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。

    Spring

    Spring 号称配置地狱,Annotation也不少。

    Hibernate

    Hibernate还有大量的关于联合的annotation和继承的annotation,这里就不意义列举了。

    JSR 303 – Bean Validation

    JSR 303 – Bean Validation是一个数据验证的规范,其对Java bean的验证主要通过Java annotation来实现。

    其实还有很多使用了annotaion的framework或library,这里就不一一列举了,希望大家能举一反三,深入了解Java中的annotation。

    以上就是详解Java Annotation特性的掌握的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java ,Annotation
    上一篇:详解Java细粒度锁实现的3种方式的示例代码 下一篇:Java LinkedList源码剖析(图)
    PHP编程就业班

    相关文章推荐

    • 完全掌握java异常处理机制原理和应用• 一起聊聊JAVA中字符串和数组做参数传递• 一起聊聊Java常用数据类型的输入输出• 详细解析Java反射机制原理和几种Class获取方式• 归纳整理Java并发知识点

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网