程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java基礎鞏固筆記(6)-注解

java基礎鞏固筆記(6)-注解

編輯:JAVA綜合教程

java基礎鞏固筆記(6)-注解


注解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。

API

注解的應用結構圖

調用/結構關系:A<–B<–C

A,B,C解釋如下:

A:注解類

@interface A{
}

B:應用了“注解類”的類

@A
Class B{
}

C:對“應用了注解類的類”進行反射操作的類

Class C{
   public void f(){
     B.class.isAnnotationPresent(A.class);
     A a = B.class.getAnnotion(A.class);
   }
}

元注解

元注解的作用就是負責注解其他注解。四個元注解分別是:@Target,@Retention,@Documented,@Inherited

@Retention

表示在什麼級別保存該注解信息。可選的參數值在枚舉類型 RetentionPolicy中,包括RetentionPolicy.SOURCE,RetentionPolicy.CLASS(默認),RetentionPolicy.RUNTIME分別對應:java源文件–>class文件–>內存中的字節碼

RetentionPolicy.SOURCE 注解將被編譯器丟棄 
RetentionPolicy.CLASS 注解在class文件中可用,但會被VM丟棄
RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的信息。 
@Target

表示該注解用於什麼地方,可能的值在枚舉類ElemenetType中,包括

ElemenetType.CONSTRUCTOR 構造器聲明 
ElemenetType.FIELD 域聲明(包括 enum 實例) 
ElemenetType.LOCAL_VARIABLE 局部變量聲明 
ElemenetType.METHOD 方法聲明 
ElemenetType.PACKAGE 包聲明 
ElemenetType.PARAMETER 參數聲明 
ElemenetType.TYPE 類,接口(包括注解類型)或enum聲明 
@Documented

將此注解包含在javadoc中 ,它代表著此注解會被javadoc工具提取成文檔。在doc文檔中的內容會因為此注解的信息內容不同而不同。相當於@see,@param

@Inherited

允許子類繼承父類中的注解

自定義注解

使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節。在定義注解時,不能繼承其他的注解或接口。@interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數的默認值。

定義注解格式:

public @interface 注解名 {定義體}

注解參數的可支持數據類型:

1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
2.String類型
3.Class類型
4.enum類型
5.Annotation類型
6.以上所有類型的數組

示例代碼

下面的示例,是上文提到的A<–B<–C的擴充版本。自定義了一個注解@A,然後在B類中使用了注解@A,最後在類C中利用反射讀取@A中的信息

A.java
package com.iot.annotation;

import java.lang.annotation.*;

/**
 * Created by brian on 2016/2/20.
 */
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
    String name();
    int id() default 0;
    Class gid();
}
B.java
package com.iot.annotation;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by brian on 2016/2/20.
 */
@A(name="type",gid=Long.class)//類注解
public class B {
    @A(name="param",id=1,gid=Long.class) //類成員注解
    private Integer age;

    @A(name="construct",id=2,gid=Long.class) //構造方法注解
    public B(){}

    @A(name="public method",id=3,gid=Long.class) //類方法注解
    public void a(){

    }

    @A(name="protected method",id=4,gid=Long.class) //類方法注解
    protected void b(){
        Map m = new HashMap(0);
    }


    @A(name="private method",id=5,gid=Long.class) //類方法注解
    private void c(){
        Map m = new HashMap(0);
    }

    public void b(Integer a){

    }
}
C.java
package com.iot.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * Created by brian on 2016/2/20.
 */
public class C {

    /**
     * 簡單打印出B類中所使用到的類注解
     * 該方法只打印了 Type 類型的注解
     * @throws ClassNotFoundException
     */
    public static void parseTypeAnnotation() throws ClassNotFoundException{
        Class clazz = Class.forName("com.iot.annotation.B");

        Annotation[] annotations = clazz.getAnnotations();
        for(Annotation annotation :annotations){
            A a = (A)annotation;
            System.out.println("id = "+a.id()+" ;name = "+a.name()+" ;gid = "+a.gid());
        }

    }

    /**
     * 簡單打印出B類中所使用到的方法注解
     * 該方法只打印了 Method 類型的注解
     */
    public static void parseMethodAnnotation() {
        Method[] methods = B.class.getDeclaredMethods();
        for (Method method : methods) {
            /*
             * 判斷方法中是否有指定注解類型的注解
             */
            boolean hasAnnotation = method.isAnnotationPresent(A.class);
            if (hasAnnotation) {
                /*
                 * 根據注解類型返回方法的指定類型注解
                 */
                A annotation = method.getAnnotation(A.class);
                System.out.println("method = " + method.getName()
                        + " ; id = " + annotation.id() + " ; description = "
                        + annotation.name() + "; gid= " + annotation.gid());
            }
        }
    }

    /**
     * 簡單打印出B類中所使用到的方法注解
     * 該方法只打印了 Method 類型的注解
     */
    public static void parseConstructAnnotation(){
        Constructor[] constructors = B.class.getConstructors();
        for (Constructor constructor : constructors) {
            /*
             * 判斷構造方法中是否有指定注解類型的注解
             */
            boolean hasAnnotation = constructor.isAnnotationPresent(A.class);
            if (hasAnnotation) {
                /*
                 * 根據注解類型返回方法的指定類型注解
                 */
                A annotation =(A) constructor.getAnnotation(A.class);
                System.out.println("constructor = " + constructor.getName()
                        + " ; id = " + annotation.id() + " ; description = "
                        + annotation.name() + "; gid= "+annotation.gid());
            }
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
        parseTypeAnnotation();
        parseMethodAnnotation();
        parseConstructAnnotation();
    }

}
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved