原文地址:http://www.cnblogs.com/pepcod/archive/2013/02/20/2918719.html java 注解,從名字上看是注釋,解釋。但功能卻不僅僅是注釋那么簡單。注解(Annotation) 為我們在代碼中添加信息提供了一種形式化的方法,是我們可以在稍后 某個時刻方便地使用這些數據(通過 解析注解 來使用這些數據),常見的作用有以下幾種:
生成文檔。這是最常見的,也是java 最早提供的注解。常用的有@see @param @return 等跟蹤代碼依賴性,實現替代配置文件功能。比較常見的是sPRing 2.5 開始的基于注解配置。作用就是減少配置?,F在的框架基本都使用了這種配置來減少配置文件的數量。在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法并不是覆蓋了超類方法,則編譯時就能檢查出。包 java.lang.annotation 中包含所有定義自定義注解所需用到的原注解和接口。如接口 java.lang.annotation.Annotation 是所有注解繼承的接口,并且是自動繼承,不需要定義時指定,類似于所有類都自動繼承Object。
該包同時定義了四個元注解,Documented,Inherited,Target(作用范圍,方法,屬性,構造方法等),Retention(生命范圍,源代碼,class,runtime)。下面將在實例中逐個講解他們的作用,及使用方法。
第一個注解
package annotation.test;/** *@interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。 *方法的名稱就是參數的名稱,返回值類型就是參數的類型。 *可以通過default來聲明參數的默認值。 *在這里可以看到@Retention和@Target這樣的元注解,用來聲明注解本身的行為。 *@Retention用來聲明注解的保留策略,有CLASS、RUNTIME和SOURCE這三種, *分別表示注解保存在類文件、JVM運行時刻和源代碼中。 *只有當聲明為RUNTIME的時候,才能夠在運行時刻通過反射API來獲取到注解的信息。 *@Target用來聲明注解可以被添加在哪些類型的元素上,如類型、方法和域等。 *就可以定義一個注解了,它將自動繼承Annotation */public @interface TestA {//這里定義了一個空的注解,它能干什么呢。我也不知道,但他能用。 后面有補充}package annotation.test;import java.util.HashMap;import java.util.Map;/** * 這個類專門用來測試注解使用 * @author tmser */@TestA //使用了類注解public class UserAnnotation { @TestA //使用了類成員注解 private Integer age; @TestA //使用了構造方法注解 public UserAnnotation(){ } @TestA //使用了類方法注解 public void a(){ @TestA //使用了局部變量注解 Map m = new HashMap(0); } public void b(@TestA Integer a){ //使用了方法參數注解 }}編譯沒有報錯,ok,一個注解實驗完成。這個注解也太簡單了吧,好像什么信息也不能傳遞。別急下面就來一步步完善它,也該四位元注解依次開始上場了。
四個元注解分別是:@Target,@Retention,@Documented,@Inherited ,再次強調下元注解是java API提供,是專門用來定義注解的注解,其作用在上篇中已經說過。
學習最忌好高騖遠,我們就一個一個來實驗。第一個:@Target,動手在前面我們編寫的注解上加上元注解。
修改注解類:
package annotation.test;import java.lang.annotation.ElementType;import java.lang.annotation.Target;/* * 定義注解 Test * 首先使用ElementType.TYPE */ @Target(ElementType.PACKAGE) public @interface TestA {}新聞熱點
疑難解答