第十四章:注解

来源:互联网 发布:支付宝 java 服务器端 编辑:程序博客网 时间:2024/05/01 12:14

1. Annotation:注解。是JDK5.0以上版本提供的可以添加到代码之上的修饰符,用来对该代码进行解释和说明。
   1) 可以放置在类的任何组成部分,如:包声明、类(或接口)声明、构造方法、普通方法、成员变量、参数和局部变量。
   2) 注解的使用不会影响代码的功能。
  
2. Java SE API中提供了三个内置注解类型:定义在java.lang包中。注解类型使用时要用@符来引用。
   1) Override:表示一个方法声明打算重写超类中的另一个方法声明。只能用在方法上。它只会保存在源文件中,编译成字节码时会被丢弃。
   2) Deprecated:它修饰元素时表示不鼓励程序员使用这样的元素。它可以添加到类的任何位置。它会编译到字节码中,并且JVM可以获取它的信息
   3) SupressWarnings:用来阻止编译器警告。它可用在除包以外的任何位置。它带有一个属性叫value,指定要阻止的警告集。

 

3. 自定义注解。注解的定义类似于接口。
   1) @interface来定义注解类型。
      public @interface MyAnno{}
   2) 通过定义一个同名方法可以在注解类型中添加一个属性,返回值类型就是这个属性的类型。
      public @interface MyAnno{
          String name();
          String[] value();
      }
   3) 默认创建的注解类型可以使用类的任何位置。
  
4. 注解的注解,也叫无注解。它用来指定自定义的注解类型可对放置的位置,保留多久,是否可文档化。内置的元注解定义在java.lang.annotation包中:
  1) Target:指示注释类型所适用的程序元素的种类。它的属性value要指定为ElementType的枚举值之一:
        TYPE, //适用于 类,接口,枚举
        FIELD, //适用于 成员字段
        METHOD, //适用于 方法
        PARAMETER, //适用于 方法的参数
        CONSTRUCTOR, //适用于 构造方法
        LOCAL_VARIABLE, //适用于 局部变量
        ANNOTATION_TYPE, //适用于 注解类型
        PACKAGE          //适用于 包
  2) Retention:用来告诉编译器如何处理当前注解。它的属性value要指定为RetentionPolicy的枚举值之一:
        SOURCE, //编译器处理完后,并不将它保留到编译后的类文件中
        CLASS, //编译器将注解保留在编译后的类文件中,但是在运行时忽略它
        RUNTIME //编译器将注解保留在编译后的类文件中,并在第一次加载类时读取它。
                   如果需要通过反射来获取某个注解类型信息时,此注解类型在定义必须指定Retention为RetentionPolicy.RUNTIME。
  3) Document:可以使被修饰的注解在使用到类元素时,会加入到Javadoc中。
     a) 定义为Documented的注解必须要设置Retention的值为RetentionPolicy.RUNTIME。
 
  4) 示例: 自定义一个注解类型
     @Document
     @Retention(RetentionPolicy.RUNTIME)
     @Target({ElementType.TYPE})
     public @interface Dao{
         String name();
         String value();
     }
           使用自定义的注解类型
    @Dao(name="bookDao", value="com.qiujy.dao.impl.BookDaoOracleImpl")
    public class BookService{  ... }
   
5. 通过反射机制来获取注解类型信息
  1) JDK5.0中的java.lang.reflect.AnnotatedElement接口中定义了4个反射性地读取注解信息的方法:
    public Annotation getAnnotation(Class annotationType); 如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null
    public Annotation[] getAnnotations();返回此元素上存在的所有注解
    public Annotation[] getDeclaredAnnotations(); 返回直接存在于此元素上的所有注解
    public boolean isAnnotationPresent(Class annotationType); 如果指定类型的注解存在于此元素上,则返回 true,否则返回 false
  2) java.lang.Class类和java.lang.reflect包中的Constructor, Field, Method, Package类都实现了
    AnnotationElement接口,可以从这些类的实例上分别取得标注于其上的注解及相关信息。

  3) 示例:
     Annotation anno = BookService.class.getAnnotation(Dao.class);
     if(null != anno){
      Class clazz = anno.annotationType();
      Method method = clazz.getDeclaredMethod("name");
  String name = (String)method.invoke(anno);
  Method method2 = clazz.getDeclaredMethod("value");
  String value = (String)method2.invoke(anno);
  ...
     }
    
6. 枚举类型: JDK5.0以上版本提供了一种新的数据类型叫枚举,它是引用类型.
  1) 定义枚举类型:enum关键字来定义。枚举值用逗号分隔。如
     public enum Color{ RED, BLUE, GREENT; }
  2) 在枚举类型中也可以定义属性,方法和构造方法(默认就是private的,不能添加其它访问修饰符)。如:
     public enum Color{
        RED("红色", 1), BLUE("蓝色", 2), GREEN("绿色", 3);
        private String name;
        private int value;
        Color(String name, int value){
           this.name = name;
           this.value = value;
        }
       
        public String toString(){
            return this.name;
        }
       
        public int getValue(){
            return this.value;
        }
     }
    
  3) 枚举类型就是引用类型,可以用来声明变量和参数。如:private Color eyeColor = Color.BLUE;
              取枚举值时直接用枚举类型名.枚举值名,如Color.RED
              调用枚举类型中定义的方法:Color.BLUE.toString(); Color.GREEN.getName();
 
  4) JDK1.4之前没有枚举类型时,使用类或接口来定义常量来代表。

原创粉丝点击