zoukankan      html  css  js  c++  java
  • Annotation注释详解~

    注释:

    jdk5.0后,Java增加了对元数据的支持。也就是Annotation(注释)。

    他是是代码中的特殊标记,可以在代码编译,类加载,运行时被读取,并执行相应的处理。这样用Annotation开发在不改变原有逻辑情况下,在源文件中补充嵌入一些信息。开发工具可以通过这些信息进行验证,或部署。

    Annotation提供了条为程序元素设置元数据的方法。从某些方面来看,Annotation就像修饰符一样被使用。可用于修饰包,类,成员变量,方法,参数,构造器,局部变量的声明。这些信息储存在Annotation的“name=value”对中。

    注意:Annotation是一个接口。程序可以通过反射来获得指定程序元素的Annotation对象,然后通过Annotation对象获得注释里的元数据。

    接下来提到的Annotation,有的是Java.lang,Annotation,有的是注释本身。

    Annotation不能影响程序的执行,增加或减少Annotation,程序都一如既往得执行。如果希望程序里的Annotation发挥作用,只有通过配套的工具(Annotation Processing Tool)对Annotation里的信息访问和处理。

    Annotation必须通过工具处理,工具负责处理Annotation里面包含的元数据。工具会根据里面的元数据增加额外的功能。先了解下三个Annotation的基本用法。

    使用Annotation,在其前面加@,并把该Annotation当做修饰符来用,用来支持他修饰的程序元素。

    @Override

    @deprecated

    @SuppressWarnnings

    @Override修饰一个方法,指定方法覆载(告诉编译器要检查这个方法,并从父类查找是否包含了被该方法重写的方法,否则就编译错误)。强制一个子类必须覆盖覆类方法。

    @deprecated

    标记程序元素已过时。当其他程序使用它时,就会发出警告。

    @SuppressWarnnings

    刚刚介绍的是java.lang.Annotation三个基本的注释,

    下面介绍自定义的Annotation,完成实际的一些功能。

    定义新的Annotation用@interface

    举例:定义了一个简单的Annotation

     public @interface Test{
             
         }

    使用它修饰类

     @Test
    public class Apple<T extends Number> {
    }

     修改方法

    import org.junit.Test; 
    public class Apple<T extends Number> {
        @Test
        public void name() {
            
        }
    }

    可修饰任何程序元素,类,接口,方法等

    同时带成员变量的Annotation

    public @interface Test{
        //注释里的成员变量以方法形式定义
        String name();
        int age();
    }

      定义了成员变量后,使用它的时候为其指定值

    public class TestCircle {
        @Test(age = 5, name = "小猪")
      public void name() {
        
    } 
    }

     也可以在定义它时为它指定初始值(如果有初始化的默认值,就可以在使用时不 指定值,有了指定值,初始值就不起作用)

     
    public @interface Test{
        //注释里的成员变量以方法形式定义
        String name() default "小猪";
        int age() default 7;
    }

    根据Annotation里是否包含成员变量可以把其分成两类:

    标记Annotation:不包含成员变量,如@Override

    元数据Annotation:包含成员变量,因为他可以接受更多的元数据,所以叫元数据Annotation

    提取Annotation信息

    前面提到了java用Annotation接口来代表程序前面的注释。AnnotatedElement这个接口是所有的Annotation类型的父接口。该接口有以下几个实现类

    Class类定义

    Constructor构造器定义

    Package包定义

    Field类的成员变量定义

    Method类的方法定义

    以上扩充了读取运行时Annotation的能力。当一个Annotation被定义为运行Annotation后,该注释运行时才可见,当class文件被装载时,被保存class文件里的Annotation才会被虚拟机读取。在java反射包AnnotatedElement代表了程序中可接受注释的程序元素。

    程序如果通过反射获得AnnotatedElement接口实现类,可以通过调用该类的如下三个方法获得Annotation信息。

    getAnnotation(Class<T> annotationClass) 获得该元素存在的指定类型的注释。

    getAnnotations() 获得该元素存在的所有注释。

    boolean isAnnotationPresent(Class<? extend AnnotationannotationClass)判断该程序元素是否包含了指定元素的注释。存在返回True,不存在返回false

     

     下面是使用 Annotation举例

    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.ElementType;
    
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)  //@Retention注释该注释在jvm运行时保留
    @Target(ElementType.METHOD)  //定义注解应用类
    public @interface Test{
       String name() default "小猪";
       int age() default 5;
    }

     

    public class TestCircle {
        @Test(age = 5, name = "小猪")
      public void name() {
        
    } 
    }

    上面提到的这些注释仅仅标识程序元素,不会对程序有任何影响。为了让注释起作用,必须为注释提供一个注释处理工具。

    待续....

  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/yizhizhangBlog/p/9299609.html
Copyright © 2011-2022 走看看