一、概念
Annontation是Java5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。更通俗的意思是為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明信息是與程序的業務邏輯無關,并且是供指定的工具或框架使用的。
Annontation像一種修飾符一樣,應用于包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。
java.lang.annotation.Annotation接口是所有的Annotation都必須實現的接口。
系統內建的Annotation
@Override
java.lang.Override是一個marker annotation類型,它被用作標注方法。它說明了被標注的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。
class Person{ public String getInfo(){ // 取得信息 return "這是一個Person類。" ; }};class Student extends Person{ // 繼承此類 @Override public String getinfo(){ // 覆寫方法 return "這是一個Student類。" ; }};public class OverrideAnnotationDemo{ public static void main(String args[]){ Person per = new Student() ; System.out.PRintln(per.getInfo()) ; // 輸出信息 }};使用@Override注釋可以保證程序的正確執行
@Deprecated
Deprecated也是一種marker annotation。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標注的程序元素。所以使用這種修飾具有一定的 “延續性”:如果我們在代碼中通過繼承或者覆蓋的方式使用了這個過時的類型或者成員,雖然繼承或者覆蓋后的類型或者成員并不是被聲明為@Deprecated,但編譯器仍然要報警。
@Deprecated // 聲明不建議使用的操作class Demo{ public String getInfo(){ return "這是一個Person類。" ; }};public class DeprecatedAnnotationDemo02{ public static void main(String args[]){ Demo d = new Demo() ; System.out.println(d.getInfo()) ; }};@SuppressWarnings
此注解能告訴Java編譯器關閉對類、方法及成員變量的警告。有時編譯時會提出一些警告,對于這些警告有的隱藏著Bug,有的是無法避免的,對于某些不想看到的警告信息,可以通過這個注解來屏蔽。
SuppressWarning不是一個marker annotation。它有一個類型為String[]的成員,這個成員的值為被禁止的警告名。對于javac編譯器來講,被-Xlint選項有效的警告名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。
@Deprecatedclass Demo<T>{ private T var ; public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; }};public class SuppressWarningsAnnotationDemo03{ @SuppressWarnings(value={"unchecked","deprecation"}) public static void main(String args[]){ Demo d = new Demo() ; d.setVar("偶my耶") ; System.out.println("內容:" + d.getVar()) ; }};反射與annontation
如果想要一個Annotation起作用必須要有反射機制
示例如下
package org.lxh.demo16.reflectannotation ;public class SimpleBeanOne{ @SuppressWarnings("unchecked") @Deprecated @Override public String toString(){ return "Hello oumyye!!!" ; }};同時設置三個Annotation,那么此時注意,只有Deprecated的Annotation的定義范圍是RUNTIME范圍,所以此時通過反射的話只能取得一個。
import java.lang.annotation.Annotation ;import java.lang.reflect.Method ;public class ReflectDemo01{ public static void main(String args[]) throws Exception{ // 所有異常拋出 Class <?> c = null ; c = Class.forName("org.lxh.demo16.reflectannotation.SimpleBeanOne") ; Method toM = c.getMethod("toString") ; // 找到toString()方法 Annotation an[] = toM.getAnnotations() ; // 取得全部的Annotation for(Annotation a:an){ // 使用 foreach輸出 System.out.println(a) ; } }};此時,已經取得一個Annotation。
新聞熱點
疑難解答