1. 程式人生 > >註解和反射操作註解

註解和反射操作註解

什麼是註解?

• Annotation是從JDK5.0開始引入的新技術。
• Annotation的作用:
– 不是程式本身,可以對程式作出解釋。(這一點,跟註釋沒什麼區別)
– 可以被其他程式(比如:編譯器等)讀取。(註解資訊處理流程,是註解和註釋的重大區別
。如果沒有註解資訊處理流程,則註解毫無意義)
• Annotation的格式:
– 註解是以“@註釋名”在程式碼中存在的,還可以新增一些引數值,例如:
@SuppressWarnings(value="unchecked")。
• Annotation在哪裡使用?
– 可以附加在package, class, method, field等上面,相當於給它們添加了額外的輔助信
息,我們可以通過反射機制程式設計實現對這些元資料的訪問。
• @Override
– 定義在java.lang.Override中,此註釋只適用於修辭方法,表示一個方
法宣告打算重寫超類中的另一個方法宣告。
• @Deprecated
– 定義在java.lang.Deprecated中,此註釋可用於修辭方法、屬性、類
,表示不鼓勵程式設計師使用這樣的元素,通常是因為它很危險或存在更
好的選擇。
• @SuppressWarnings
– 定義在java.lang.SuppressWarnings中,用來抑制編譯時的警告資訊

– 與前兩個註釋有所不同,你需要新增一個引數才能正確使用,這些參
數值都是已經定義好了的,我們選擇性的使用就好了,引數如下:
– @SuppressWarnings("unchecked")
– @SuppressWarnings(value={"unchecked", "deprecation"})
自定義註解


• 使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation介面
• 要點:
– @interface用來宣告一個註解
• 格式為:
– public @interface 註解名 {定義體}
– 其中的每一個方法實際上是聲明瞭一個配置引數。
– 方法的名稱就是引數的名稱
– 返回值型別就是引數的型別(返回值型別只能是基本型別、Class、String、enum)
– 可以通過default來宣告引數的預設值。
– 如果只有一個引數成員,一般引數名為value
• 注意:
註解元素必須要有值。我們定義註解元素時,經常使用空字串、0作為預設值。
也經常使用負數(比如:-1)表示不存在的含義
• 元註解的作用就是負責註解其他註解。 Java定義了4個標準的
meta-annotation型別,它們被用來提供對其它 annotation
型別作說明。
• 這些型別和它們所支援的類在java.lang.annotation包中可以
找到
– @Target
– @Retention
– @Documented
– @Inherited
• 作用:
– 用於描述註解的使用範圍(即:被描述的註解可以用在什麼地方)
– @Target(value=ElementType.TYPE)
• 作用:
– 表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期
• 如上我們只講解了註解的定義。我們必須再將註解的讀取學會
才能轟然一體,徹底搞定註解。
try {
Class clazz = Class.forName("com.bjsxt.test.annotation.SxtStudent");
//獲得類的所有有效註解
Annotation[] annotations=clazz.getAnnotations();
for (Annotation a : annotations) {
System.out.println(a);
}//
獲得類的指定的註解
SxtTable st = (SxtTable) clazz.getAnnotation(SxtTable.class);
System.out.println(st.value());
//獲得類的屬性的註解
Field f = clazz.getDeclaredField("studentName");
SxtField sxtField = f.getAnnotation(SxtField.class);
System.out.println(sxtField.columnName()+"--"+sxtField.type()+"--"+sxtField.length());
//根據獲得的表名、 欄位的資訊, 拼出DDL語句, 然後, 使用JDBC執行這個SQL, 在數
據庫中生成相關的表
} catch (Exception e) {
e.printStackTrace();
}