JDK 5.0 註解知識快速進階

一、瞭解註解java

  對於Java開發人員來講,在編寫代碼時,除了源程序外,還會使用Javadoc標籤對類、方法或成員變量進行註釋,一遍使用Javadoc工具生成和源代碼配套的Javadoc文件,如@param、@return就是註解標籤。咱們可使用Xdoclet快速生成對應程序代碼的配置文件。在JDK5.0中,自定義這些標籤,並經過Java語言的反射機制獲取類中標註的註解,完成特定的功能。
  註解是代碼的附屬信息,它遵循一個基本原則:註解不能直接干擾程序代碼的運行,不管是增長仍是刪除註解,代碼都能正常運行。Java語言解釋器會忽略這些註解,而由第三方工具負責對註解進行處理。第三方工具能夠利用代碼中的註解間接控制程序代碼的運行,它們經過Java反射機制讀取註解的信息,並根據這些信息更改目標程序的邏輯,而這正是Spring AOP對@AspectJ提供支持所採起的方法。
 
二、一個簡單的註解類
註解類NeedTest:
package com.yyq.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//1-聲明註解的保留期限
@Target(ElementType.METHOD) //2-聲明可使用該註解的目標類型
public @interface NeedTest {    //3-定義註解
    boolean value() default true;   //4-聲明註解成員
}
    Java新語法規定使用@interface修飾符定義註解類。一個註解能夠擁有多個成員、成員聲明和接口方法聲明。成員聲明的限制:
        1)成員以無入參無拋出異常的方式聲明。
        2)能夠經過default爲成員指定一個默認值,也能夠不指定。
        3)成員類型是受限的,合法的類型包括原始類型及其封裝類,而自定義的類型如ForumService value()是非法的。
    1-和2-爲Java預約義的註解,稱爲元註解(Meta-Annotation),它們被Java編譯器使用,會對註解類的行爲產生影響。@Retention(RetentionPolicy.RUNTIME)表示NeetTest這個註解能夠在運行期被JVM讀取,註解的保留期限類型在java.lang.annotation.Retention類中定義,介紹以下:
        1)SOURCE:註解信息僅保留在目標類代碼的源碼文件中,但對應的字節碼文件將再也不保留;
        2)CLASS:註解信息將進入目標類代碼的字節碼文件中,但類加載器加載字節碼文件時不會將註解加載到JVM中,也即運行期不能獲取註解信息;
        3)RUNTIME:註解信息在目標類加載到JVM後依然保留,在運行期能夠經過反射機制讀取類中註解信息。
    Target(ElementType.METHOD)表示NeedTest這個註解只能應用到目標類的方法上,註解的應用目標在java.lang.annotation.ElementType類中定義:
        1)TYPE:類、接口、註解類、Enum聲明處,相應的註解稱爲類型註解;
        2)FIELD:類成員變量或常量聲明處,相應的註解稱爲域值註解;
        3)METHOD:方法聲明處,相應的註解稱爲方法註解;
        4)PARAMETER:參數聲明處,相應的註解稱爲參數註解;
        5)CONSTRUCTOR:構造函數聲明處,相應的註解稱爲構造函數註解;
        6)LOCAL_VARIABLE:局部變量聲明處,相應的註解稱爲局域變量註解;
        7)ANNOTATION_TYPE:註解類聲明處,相應的註解稱爲註解類註解,ElementType.TYPE包括ElementType.ANNOTATION_TYPE;
        8)PACKAGE:包聲明處,相應的註解稱爲包註解。
    若是註解只有一個成員,則成員名必須取名爲value(),在使用時能夠忽略成員名和賦值號(=),如NeedTest(true)。註解類擁有多個成員時,若是僅對value成員進行賦值則也能夠不使用賦值號,若是同時對多個成員進行賦值,則必須使用賦值號,如DeclareParents(value = "NaiveWaiter", defaultImpl = "SmartSeller.class")。
 
三、使用註解
ForumService:使用註解類
package com.yyq.annotation;
public class ForumService {
    @NeedTest(value = true)
    public void deleteForum(int forumId) {
        System.out.println("刪除論壇模塊:" + forumId);
    }
    @NeedTest(value = false)
    public void deleteTopic(int postId) {
        System.out.println("刪除論壇主題:" + postId);
    }
}

  對註解成員進行賦值的格式:函數

    @<註解名>(<成員名1>=<成員值1>,<成員名2>=<成員值2>,...)
 
四、訪問註解
    經過反射機制訪問類中的註解。訪問註解信息的方法:<T extends Annotation>T getAnnotation(Class<T> annotationClass)。
TestTool測試方法:訪問代碼中的註解
@Test
    public void ToolTest() {
        Class clazz = ForumService.class;
        Method[] methods = clazz.getDeclaredMethods();
        System.out.println(methods.length);
        for (Method method : methods) {
            NeedTest nt = method.getAnnotation(NeedTest.class);
            if (nt != null) {
                if (nt.value()) {
                    System.out.println(method.getName() + "()須要測試");
                } else {
                    System.out.println(method.getName() + "()不須要測試");
                }
            }
        }
    }
輸出結果:
2
deleteTopic()不須要測試
deleteForum()須要測試
相關文章
相關標籤/搜索