1. 程式人生 > >Java學習系列(二十一)Java面向物件之註解詳解

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
@Retention 表示在什麼級別儲存該註解資訊。可選的 RetentionPolicy 引數包括:
RetentionPolicy.SOURCE       註解將被編譯器丟棄
RetentionPolicy.CLASS        註解在class檔案中可用,但會被VM丟棄
RetentionPolicy.RUNTIME       JVM將在執行期也保留註解,因此可以通過反射機制讀取註解的資訊。

(三) @Documented
@Documented 將此註解包含在 javadoc 中

(四)@Inherited
@Inherited 允許子類繼承父類中的註解

三、例項說明

1) 作用在類上的註解
// 編譯器將把註解資訊記錄在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();
}
2) 作用在屬性(欄位)上的註解
@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的註釋分三種:單行、多行以及文件註釋。單行://後面的內容就是單行註釋;多行: