註解總結

一、理解註解 
Annotation( 註解 ) 是 JDK5.0 及以後版本引入的一個特性 。 註解是(@interface) Java 的一個新的類型(與接口很相似 ) ,它與類(Class)、接口(interface)、枚舉(enum)是在同一個層次。我們可以定義註解、聲明註解、獲得註解,並且根據獲得的註解做相應的處理,許多框架都大量應用了註解,以後繼續學習。 
二、對於java.lang.Annotation的理解 
所有定義的註解類型到會繼承該Annotation接口,定義註解需要使用@interface。 
以下爲定義了一個註解AnnotationTest: 
package com.hdjava.annotation; 
public @interface AnnotationTest { 
String param = “hello” 
String[] value () ; 
} 
} 
a. 註解可以定義final 靜態屬性,即使不寫明關鍵字系統也會默認爲final靜態屬性。當註解中的屬性名爲value時,在對其賦值時可以不指定屬性的名稱而直接寫上屬性即可;除了value意外的其他值都需要使用name=value這種複製方式,即明確指定給誰賦值 例如:@AnnotationTest(value=”hello”)或者@AnnotationTest(”hello”) 
b. 註解可以定義公共抽象的方法 
1. 方法前默認會加上 public abstract 
2. 在聲明方法時可以定義方法的默認返回值。 
例如 : String value() default “hello” ; 
3.方法返回值可以是 8 種基本類型, String 、 Class 、枚舉、註解及這些類型的數組。 
c.註解定義說明 
1.當我們使用@interface關鍵字定義一個註解時,該註解隱含地繼承了 
java.lang.annotation.Annotation接口; 
2.如果我們定義了一個接口,並且讓該接口繼承自Annotation,那麼我們所定義的依然是接口而不是註解; 
3.Annotation本身是接口而不是註解。可以與Enum類比。 
三、三個Java基本註解 
3.1、@Override 
該註解用在方法前面,用來標識該方法是重寫父類的某個方法。 
package com.hdjava.annotation; 
public class OverrideTest { 
@Override 
public String toString() { 
return "this is OverrideTest toString"; 
} 
} 
3.2、@Deprecated 
該註解的作用是標記某個過時的類或方法。 
package com.hdjava.annotation; 
public class DeprecatedTest { 
@Deprecated 
public static void doSomething(){ 
System.out.println("do nothing"); 
} 
public static void main(String[] args) { 
doSomething(); 
} 
} 
3.3、@SuppressWarnings 
該註解的作用是阻止編譯器發出某些警告信息。 
它可以有以下參數 : 
deprecation :過時的類或方法警告。例如:new Date().toLocal 
unchecked :執行了未檢查的轉換時警告。例如 List list = new ArrayList 
fallthrough :當 Switch 程序塊直接通往下一種情況而沒有 Break 時的警告。 
path :在類路徑、源文件路徑等中有不存在的路徑時的警告。 
serial :當在可序列化的類上缺少 serialVersionUID 定義時的警告。 
finally :任何 finally 子句不能完成時的警告。 
all :關於以上所有情況的警告。 
四、元註解 
元註解就是用來對註解類進行註解的註解。 
4.1 @Retention 
它是被定義在一個註解類的前面,用來說明該註解的生命週期。 
它有以下參數: 
RetentionPolicy.SOURCE :指定註解只保留在一個源文件當中。 
RetentionPolicy.CLASS :指定註解只保留在一個 class 文件中。 
RetentionPolicy.RUNTIME :指定註解可以保留在程序運行期間。 
4.2 RetentionPolicy 
枚舉類型:定義了Retention的類型 
public enum RetentionPolicy { 
SOURCE, 
CLASS, 
RUNTIME 
} 
4.3 @Target 
它是被定義在一個註解類的前面,用來說明該註解可以被聲明在哪些元素前。 
它有以下參數: 
ElementType.TYPE :說明該註解只能被聲明在一個類前。 
ElementType.FIELD :說明該註解只能被聲明在一個類的字段前。 
ElementType.METHOD :說明該註解只能被聲明在一個類的方法前。 
ElementType.PARAMETER :說明該註解只能被聲明在一個方法參數前。 
ElementType.CONSTRUCTOR :說明該註解只能聲明在一個類的構造方法前 。 
ElementType.LOCAL_VARIABLE :說明該註解只能聲明在一個局部變量前。 
ElementType.ANNOTATION_TYPE :說明該註解只能聲明在一個註解類型前 。 
ElementType.PACKAGE :說明該註解只能聲明在一個包名前。 
如果不加該註解表示可以聲明在任何位置 
4.4 ElementType 
枚舉類型:定義了Target的類型 
public enum ElementType { 
TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, 
LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE 
} 
4.5 @Documented 
如果類型聲明是用 Documented 來註釋的,則其註釋將成爲註釋元素的公共 API 的一部分。 
4.6 @Inherited 
指示註釋類型將被子類自動繼承。 
五、獲取註解應用舉例 
新建註解TargetAnnotation 生命週期爲RetentionPolicy.SOURCE 
@Retention(RetentionPolicy.SOURCE) 
@Target(ElementType.METHOD) 
public @interface TargetAnnotation { 
String str = "hello"; 
public abstract String value( ); 
} 
新建註解RetentionAnnotation生命週期爲RetentionPolicy.SOURCE 
@Retention(RetentionPolicy.RUNTIME) 
public @interface RetentionAnnotation { 
String name() default "jason"; 
String desp(); 
} 
使用註解的類AnnotationTest 
public class AnnotationTest { 
@TargetAnnotation("world") 
@RetentionAnnotation(desp = "jinan") 
@Deprecated 
@SuppressWarnings("unchecked") 
public void output(){ 
System.out.println("this is method output"); 
} 
} 
獲取註解測試類 
public class MyReflection { 
@SuppressWarnings("unchecked") 
public static void main(String[] args) throws Exception{ 
AnnotationTest test = new AnnotationTest(); 
Class cls = test.getClass(); 
Method method = cls.getMethod("output", new Class[]{}); 
RetentionAnnotation annotation = method.getAnnotation(RetentionAnnotation.class); 
Annotation[]annotations = method.getAnnotations(); 
System.out.println(annotation.annotationType().getName()); 
System.out.println(annotation.name()); 
System.out.println(annotation.desp()); 
for(@SuppressWarnings("unused") 
Annotation a :annotations){ 
System.out.println(a.annotationType().getName()); 
} 
} 
} 
運行結果: 
jason 
jinan 
com.hdjava.annotation.RetentionAnnotation 
java.lang.Deprecated
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章