zoukankan      html  css  js  c++  java
  • 【深入JAVA】java注解

    在阅读的过程中有不论什么问题,欢迎一起交流

    邮箱:1494713801@qq.com   

    QQ:1494713801

     

    1、什么是java注解
        注解,顾名思义,注解,就是对某一事物进行加入凝视说明,会存放一些信息。这些信息可能对以后某个时段来说是非常实用处的。 java提供了一套注解机制,使得我们能够对方法、类、參数、包、域以及变量等加入标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。


    2、JDK提供的基本注解 
    a. @SuppressWarnings 该注解的作用是阻止编译器发出某些警告信息。它能够有下面參数:
        deprecation:过时的类或方法警告。
        unchecked:运行了未检查的转换时警告。


        fallthrough:当Switch程序块直接通往下一种情况而没有Break时的警告。


        path:在类路径、源文件路径等中有不存在的路径时的警告。
        serial:当在可序列化的类上缺少serialVersionUID定义时的警告。


        finally:不论什么finally子句不能完毕时的警告。
        all:关于以上全部情况的警告。


    b.@Deprecated 该注解的作用是标记某个过时的类或方法。


    c. @Override 该注解用在方法前面,用来标识该方法是重写父类的某个方法。

    3、元注解 
    a. @Retention 它是被定义在一个注解类的前面,用来说明该注解的生命周期。它有下面參数:
        RetentionPolicy.SOURCE:指定注解仅仅保留在一个源文件其中。
        RetentionPolicy.CLASS:指定注解仅仅保留在一个class文件里。
        RetentionPolicy.RUNTIME:指定注解能够保留在程序执行期间。
    b. @Target 它是被定义在一个注解类的前面,用来说明该注解能够被声明在哪些元素前。

    它有下面參数:
        ElementType.TYPE:说明该注解仅仅能被声明在一个类前。


        ElementType.FIELD:说明该注解仅仅能被声明在一个类的字段前。
        ElementType.METHOD:说明该注解仅仅能被声明在一个类的方法前。
        ElementType.PARAMETER:说明该注解仅仅能被声明在一个方法參数。
        ElementType.CONSTRUCTOR:说明该注解仅仅能声明在一个类的构造方法前。


        ElementType.LOCAL_VARIABLE:说明该注解仅仅能声明在一个局部变量前。


        ElementType.ANNOTATION_TYPE:说明该注解仅仅能声明在一个注解类型前。
        ElementType.PACKAGE:说明该注解仅仅能声明在一个包名前。

    4、注解的生命周期
    一个注解能够有三个生命周期,它默认的生命周期是保留在一个CLASS文件,但它也能够由一个@Retetion的元注解指定它的生命周期。
        a.java源文件 当在一个注解类前定义了一个@Retetion(RetentionPolicy.SOURCE)的注解,那么说明该注解仅仅保留在一个源文件其中。当编译器将源文件编译成class文件时,它不会将源文件里定义的注解保留在class文件里。


        b. class文件里 当在一个注解类前定义了一个@Retetion(RetentionPolicy.CLASS)的注解。那么说明该注解仅仅保留在一个class文件其中,当载入class文件到内存时,虚拟机会将注解去掉,从而在程序中不能訪问。
        c. 程序执行期间 当在一个注解类前定义了一个@Retetion(RetentionPolicy.RUNTIME)的注解,那么说明该注解在程序执行期间都会存在内存其中。此时,我们能够通过反射来获得定义在某个类上的全部注解。 

    5、注解的定义 

    一个简单的注解:
     public @interface Annotation01{
            //定义公共的final静态属性.....
            //定以公共的抽象方法......
     }
      a.注解能够有哪些成员 注解和接口相似。它仅仅能定义final静态属性和公共抽象方法。
      b.注解的方法  
          1.方法前默认会加上public abstract
          2.在声明方法时能够定义方法的默认返回值。 比如: Stringcolor()default"blue"; String[]color()default{"blue","red",......}
          3.方法的返回值能够有哪些类型 8种基本类型,String、Class、枚举、注解及这些类型的数组。
      c.使用注解(參照以下的注解使用)注解的使用分为三个过程。

    定义注解-->声明注解-->得到注解
          a.定义注解(參照上面的注解定义)
          b.声明注解
              1.在哪些元素上声明注解 假设定义注解时没有指定@Target元注解来限制它的使用范围。那么该注解能够使用在ElementType枚举指定的不论什么一个元素前。

    否则。仅仅能声明在@Target元注解指定的元素前。 一般形式: @注解名()
              2.对注解的方法的返回值进行赋值 对于注解中定义的每个没有默认返回值的方法。在声明注解时必须对它的每个方法的返回值进行赋值。

    一般形式: @注解名(方法名=方法返回值。、、、、、、) 假设方法返回的是一个数组时。那么将方法返回值写在{}符号里 @注解名(方法名={返回值1,返回值2,、、、、、、},、、、、、、、)
              3.对于仅仅含有value方法的注解,在声明注解时能够仅仅写返回值。


          c.得到注解 对于生命周期为执行期间的注解。都能够通过反射获得该元素上的注解实例。
              1、声明在一个类中的注解 能够通过该类Class对象的getAnnotation或getAnnotations方法获得。
              2、声明在一个字段中的注解 通过Field对象的getAnnotation或getAnnotations方法获得
              3、声明在一个方法中的注解 通过Method对象的getAnnotation或getAnnotations方法获得 

    6、样例
    以下讲的设计一个最简单的Annotation样例,这一样例共用四个文件;
       1、Description.java

    Java代码 复制代码
    1. package lighter.javaeye.com;   
    2.   
    3. import java.lang.annotation.Documented;   
    4. import java.lang.annotation.ElementType;   
    5. import java.lang.annotation.Retention;   
    6. import java.lang.annotation.RetentionPolicy;   
    7. import java.lang.annotation.Target;   
    8.   
    9. @Target(ElementType.TYPE)   
    10. @Retention(RetentionPolicy.RUNTIME)   
    11. @Documented  
    12. public @interface Description {   
    13.     String value();   
    14. }  

       说明:全部的Annotation会自己主动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口.
       最重要的一点,Annotation类型里面的參数该怎么设定:
       第一,仅仅能用public或默认(default)这两个訪问权修饰.比如,String value();这里把方法设为defaul默认类型.
       第二,參数成员仅仅能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.比如,String value();这里的參数成员就为String.
       第三,假设仅仅有一个參数成员,最好把參数名称设为"value",后加小括号.例:上面的样例就仅仅有一个參数成员.

       2、Name.java

    Java代码 复制代码
    1. package lighter.javaeye.com;   
    2.   
    3. import java.lang.annotation.Documented;   
    4. import java.lang.annotation.ElementType;   
    5. import java.lang.annotation.Retention;   
    6. import java.lang.annotation.RetentionPolicy;   
    7. import java.lang.annotation.Target;   
    8.   
    9.  //注意这里的@Target与@Description里的不同,參数成员也不同  
    10. @Target(ElementType.METHOD)   
    11. @Retention(RetentionPolicy.RUNTIME)   
    12. @Documented  
    13. public @interface Name {   
    14.     String originate();   
    15.     String community();   
    16. }  

       3、JavaEyer.java

    Java代码 复制代码
    1. package lighter.javaeye.com;   
    2.   
    3. @Description("javaeye,做最优秀的软件开发交流社区")   
    4. public class JavaEyer {   
    5.     @Name(originate="创始人:robbin",community="javaEye")   
    6.     public String getName()   
    7.     {   
    8.         return null;   
    9.     }   
    10.        
    11.     @Name(originate="创始人:江南白衣",community="springside")   
    12.     public String getName2()   
    13.     {   
    14.         return "借用两位的id一用,写这一个样例,请见谅!";   
    15.     }   
    16. }  

       4、最后,写一个能够执行提取JavaEyer信息的类TestAnnotation

    Java代码 复制代码
    1.  package lighter.javaeye.com;   
    2.   
    3.   import java.lang.reflect.Method;   
    4.   import java.util.HashSet;   
    5.   import java.util.Set;   
    6.   
    7.   public class TestAnnotation {   
    8.     /** 
    9.      * author lighter 
    10.      * 说明:详细关天Annotation的API的使用方法请參见javaDoc文档 
    11.      */  
    12.        public static void main(String[] args) throws Exception {   
    13.        String  CLASS_NAME = "lighter.javaeye.com.JavaEyer";   
    14.        Class  test = Class.forName(CLASS_NAME);   
    15.        Method[] method = test.getMethods();   
    16.        boolean flag = test.isAnnotationPresent(Description.class);   
    17.         if(flag)   
    18.         {   
    19.             Description des = (Description)test.getAnnotation(Description.class);   
    20.             System.out.println("描写叙述:"+des.value());   
    21.             System.out.println("-----------------");   
    22.         }   
    23.            
    24.         //把JavaEyer这一类有利用到@Name的所有方法保存到Set中去  
    25.         Set<Method> set = new HashSet<Method>();   
    26.         for(int i=0;i<method.length;i++)   
    27.         {   
    28.             boolean otherFlag = method[i].isAnnotationPresent(Name.class);   
    29.             if(otherFlag) set.add(method[i]);   
    30.         }   
    31.         for(Method m: set)   
    32.         {   
    33.             Name name = m.getAnnotation(Name.class);   
    34.             System.out.println(name.originate());   
    35.             System.out.println("创建的社区:"+name.community());   
    36.         }   
    37.      }   
    38. }  

        5、执行结果:
         描写叙述:javaeye,做最优秀的软件开发交流社区
         -----------------
        创始人:robbin
        创建的社区:javaEye
        创始人:江南白衣
        创建的社区:springside 


  • 相关阅读:
    1104 Sum of Number Segments (20 分)(数学问题)
    1092 To Buy or Not to Buy (20 分)(hash散列)
    1082 Read Number in Chinese (25 分)(字符串处理)【背】
    1105 Spiral Matrix (25 分)(模拟)
    初识网络安全及搭建网站(内网)
    HTML5开发者需要了解的技巧和工具汇总(转)
    native+web开发模式之web前端经验分享
    移动平台3G手机网站前端开发布局技巧汇总(转)
    Asp.net 中图片存储数据库以及页面读取显示通用方法详解附源码下载
    使用H3Viewer来查看VS2010的帮助文档
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7352899.html
Copyright © 2011-2022 走看看