Java學習系列(二十一)Java面向物件之註解詳解
一、前言
Java中的註解Annotation運用到很多方面,比如之前講的單元測試中的@Test、Spring、SpringMVC還有其他框架等等。Java本身自帶的註解也有一些,比如:@Override(子類要重寫/覆寫父類的對應方法)、@Deprecated(表示方法不建議被使用)、@SuppressWarnings(抑制警告)等等。當然,我們也可以自定義一些自己需要的註解(通常可以加在包,類,欄位,方法,方法的引數以及區域性變數上),這需要Java提供的四種元註解來負責完成我們的自定義註解功能。總體來說,註解還是比較簡單的。下面先了解一下這四種元註解:
二、四種元註解(來源網路)
(一) @Target
@Target 表示該註解用於什麼地方,可取的值包括:
ElemenetType.CONSTRUCTOR 構造器宣告
ElemenetType.FIELD 欄位宣告(包括 enum 例項)
ElemenetType.LOCAL_VARIABLE 區域性變數宣告
ElemenetType.METHOD 方法宣告
ElemenetType.PACKAGE 包宣告
ElemenetType.PARAMETER 引數宣告
ElemenetType.TYPE 類,介面(包括註解型別)或enum宣告
ElementType.ANNOTATION_TYPE 註解
(二) @Retention
RetentionPolicy.SOURCE 註解將被編譯器丟棄
RetentionPolicy.CLASS 註解在class檔案中可用,但會被VM丟棄
RetentionPolicy.RUNTIME JVM將在執行期也保留註解,因此可以通過反射機制讀取註解的資訊。
(三) @Documented
@Documented 將此註解包含在 javadoc 中
(四)@Inherited
@Inherited 允許子類繼承父類中的註解
三、例項說明
1) 作用在類上的註解2) 作用在屬性(欄位)上的註解// 編譯器將把註解資訊記錄在class檔案中,當執行Java程式時JVM會保留註解,因此可以通過<a target=_blank href="http://blog.csdn.net/lhy_ycu/article/details/45289391">反射</a>機制來讀取註解的資訊。 @Retention(RetentionPolicy.RUNTIME) // 註解作用在類上面 @Target(ElementType.TYPE) public @interface ClassName { // 宣告預設值 String name() default "豆豆"; // 特殊的值 String value(); }
@Retention(RetentionPolicy.RUNTIME)
// 註解作用在屬性(欄位)上
@Target(ElementType.FIELD)
public @interface FieldName {
String value();
}
3)作用在方法上的註解
@Retention(RetentionPolicy.RUNTIME)
// 註釋作用在方法上
@Target(ElementType.METHOD)
public @interface MethodName {
String value();
Class<?> type();
}
4)例項演示
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author [*昨日重現*] [email protected]
* @since version 1.0
* @datetime 2015年4月27日 上午12:57:03
*/
// 指定用的是哪個自定義註解的類,若把name去掉,則name預設為:豆豆
@ClassName(name = "實體", value = "使用者")
public class User {
@FieldName("姓名")
private String name;
@FieldName("性別")
private String sex;
public String getName() {
return name;
}
@MethodName(type = java.lang.String.class, value = "王五")
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
@MethodName(type = java.lang.String.class, value = "男")
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + "]";
}
public static void main(String[] args) throws Exception {
Class<?> c1 = Class.forName("com.leo.annotation.User");
// Class<?> c1 = Student.class;
// 一: 獲取類上的註解資訊
// 如果該元素的指定註解型別的註解存在於此物件上則返回這些註解,否則返回 null
ClassName cn = c1.getAnnotation(ClassName.class);
System.out.println(cn.name() + " ," + cn.value());
System.out.println("\n=============================");
// 二:獲取屬性(欄位)上的註解資訊
Field f1 = c1.getDeclaredField("sex");
f1.setAccessible(true);
FieldName fn = f1.getAnnotation(FieldName.class);
System.out.println(fn.value());
// Field[] fields = c1.getDeclaredFields();
// for (Field field : fields) {
// field.setAccessible(true);
// FieldName fn = field.getAnnotation(FieldName.class);
// if (fn != null) {
// System.out.println(fn.value());
// }
// }
// 三:獲取方法上的註解資訊
Method[] methods = c1.getDeclaredMethods();
User obj = (User) c1.newInstance();
for (Method method : methods) {
System.out.println("方法名:" + method.getName());
// 檢查方法上面是否有Annotation
MethodName mn = method.getAnnotation(MethodName.class);
if (mn != null) {
// 回撥賦值。第一個引數為目標物件,第二個引數為被訪問的方法實參
method.invoke(obj, mn.value());
}
}
System.out.println(obj.getName() + " ," + obj.getSex());
}
}
四、總結
1)注意:註解不是註釋。註解是實現程式功能的重要組成部分,而註釋提供程式碼功能的說明。
2)註解使得Java原始碼中不但可以包含功能性的實現程式碼,還可以新增元資料。
相關推薦
Java學習系列(二十一)Java面向物件之註解詳解
一、前言 Java中的註解Annotation運用到很多方面,比如之前講的單元測試中的@Test、Spring、SpringMVC還有其他框架等等。Java本身自帶的註解也有一些,比如:@Override(子類要重寫/覆寫父類的對應方法)、@Deprecated(表
Java學習筆記二十一:Java面向對象的三大特性之繼承
類構造 接下來 多重 通過 prot 圖片 等級 ++ class Java面向對象的三大特性之繼承 一:繼承的概念; 繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。 繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父
Java學習系列(二十四)Java正則表示式詳解
前言 正則表示式可以說是用來處理字串的一把利器,它是一個專門匹配n個字串的字串模板,本質是查詢和替換。在例項演示之前先了解一下Pattern、Matcher這兩個工具類,Pattern:編譯好的帶匹配的模板(如:Pattern.compile("[a-z]{2}")
Java學習系列(二十二)Java面向物件之列舉詳解
一、前言 今天我們來講講列舉,希望通過這篇部落格大家能對列舉有個更全面的瞭解。列舉是一種例項(大寫)數固定的類(不能再建立例項),列舉改變了常量的宣告方式,而且它在編譯期間就限定了型別。列舉多用於確定的狀態數(如:滑鼠上下左右、IM訊息已讀未讀)、型別數(如:系統
Java學習筆記二十四:Java中的Object類
div equals int 父類 false info nim TE 操作 Java中的Object類 一:什麽是Object類; Object類是所有類的父類,相當於所有類的老祖宗,如果一個類沒有使用extends關鍵字明確標識繼承另外一個類,那麽這個類
Java進階(二十一)java 空字串與null區別
java 空字串與null區別1、型別 null表示的是一個物件的值,而並不是一個字串。例如宣告一個物件的引用,String a = null ; ""表示的是一個空字串,也就是說它的長度為0。例如宣告一個字串String str = "" ;2、記憶體分
Swift 學習之二十一:?和 !(詳解)
新更新的內容請移步閱讀: Swift語言使用var定義變數,但和別的語言不同,Swift裡不會自動給變數賦初始值, 也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化 。如果在使用變數之前不進行初始化就會報錯: var stringValue : Stri
Java學習筆記(5):3.面向物件之方法詳解
方法是類或物件的行為特徵的抽象,方法是類或物件最重要的組成成分。但從功能上看,方法完全類似於傳統結構化程式設計裡的函式。值得指出的是,Java裡的方法不能獨立存在,所有的方法必須定義在類裡。方法在邏輯上要麼屬於類,要麼屬於物件。 1.方法的所屬性 永遠不要把方法當成
osgEarth的Rex引擎原理分析(二十一)建立瓦片模型過程詳解
目標:(十七)中問題47 osgEarth/TerrainTileModelFactory.cpp TerrainTileModel* TerrainTileModelFactory::createTileModel(const MapFrame& fr
Java面向物件之異常詳解
目錄 Java面向物件之異常【一】 Java面向物件之異常【二】 捕獲異常的規則 訪問異常資訊 異常對方法重寫的影響 finally詳解
三十一、併發程式設計之FutureTask詳解
一、Future是一個介面,它定義了5個方法 boolean cancel(boolean mayInterruptInRunning) //取消一個任務,並返回取消結果。引數表示是否中斷執行緒。 boolean isCancelled() //判斷任務是否被取消 Boolean isD
Java學習系列(二十三)Java面向物件之內部類詳解
一、前言 內部類也稱寄生類,就是把一個類放在類裡面(即內部類的上一級程式單元是類)定義,將其作為外部類的成員。內部類主要用幾種定義形式:靜態(static)內部類,非靜態內部類,匿名內部類(也就是沒有名字的寄生類)。內部類的好處就是內部類可以直接外部類的(包括私有)
Java學習筆記二十二:Java的方法重寫
nim 技術分享 例子 system family AC tro pack 不能 Java的方法重寫 一:什麽是方法的重寫; 如果子類對繼承父類的方法不滿意,是可以重寫父類繼承的方法的,當調用方法時會優先調用子類的方法。 語法規則 返回值類型、方法名、參
Java併發(二十一):執行緒池實現原理 Java併發(十八):阻塞佇列BlockingQueue Java併發(十八):阻塞佇列BlockingQueue Java併發程式設計:執行緒池的使用
一、總覽 執行緒池類ThreadPoolExecutor的相關類需要先了解: (圖片來自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8%A7%88) Executor:位於最頂層,只有一個 execute(Runnab
Java併發(二十一):執行緒池實現原理
Java併發(二十一):執行緒池實現原理 一、總覽 執行緒池類ThreadPoolExecutor的相關類需要先了解: (圖片來自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8%A7%88) E
Java學習的第十一天---多型
abstract class Animal{ abstract void eat(); } class Cat extends Animal{ public void eat(){ System.out.println("吃魚");
final關鍵字 ——Thinking in Java學習筆記(十一)
final的使用情況一般分為三種:資料、方法、類 final資料 final修飾的資料表示值不可變,引用不能改變。其中,對資料的修飾又分為: 1、final成員變數:由final修飾的類成員變數,如果是基礎資料型別就表示不能改變它的值,但如果是已經初始化了的引用
Java筆記(二十一) 動態代理
動態代理 一、靜態代理 代理的背後一般至少有一個實際物件,代理的外部功能和實際物件一般是一樣的, 使用者與代理打交道,不直接接觸實際物件。代理存在的價值: 1)節省成本比較高的實際物件建立開銷,按需延遲載入,建立代理時 並不正真建立實際物件,而只是儲存實際物件的地址,在需要時再載入或者建立。 2)
JAVA學習總結二十二
WEB學習第二課 HTTP響應資訊分四部分 狀態行:描述HTTP協議版本、狀態嗎、狀態描述 響應頭:以鍵值對方式描述伺服器相關的狀態 空行:標識響應頭的結束和訊息體的開始 訊息體:描述伺服器傳送給客戶端的內容 注:傳統的WEB伺服器產生響應時,只能產生
Java學習系列(二)Java註釋、識別符號、基本資料型別及其轉換易錯點詳解
Java註釋 前面我們講了下Java的執行機制及JDK的安裝配置等相關操作,今天我們先從Java的註釋開始。Java註釋對程式本身沒有影響,主要是開發者提供一些輔助資訊來更好的理解。首先,Java的註釋分三種:單行、多行以及文件註釋。單行://後面的內容就是單行註釋;多行: