黑馬程序員_【總結】_ 高新_4_註解 Annotation

註解 Annotation


---------- android培訓 java培訓、期待與您交流! ---------- 

---------------------------------------------------------------------------------------------------------------------------------------------
註解
1、一個註解,就是一個類,相當於是一個標記,什麼樣的標記,幹什麼樣的事兒。
2、常見的註解
 @SuppressWarnings 取消顯示指定的編譯器警告。
 @Deprecated 過時,或者通常是因爲它很危險或存在更好的選擇。
 @Override 一個方法聲明打算重寫超類中的另一個方法聲明。
3、@Retention 一個註解的聲明週期有3個階段
1、Java源文件--->RetentionPolig.SOURCR   註解只保留在源文件中
2、class文件--->RetentionPolig.CLASS    註解只保留在class文件中
3、內存中的字節碼--->RetentionPolig.RUNTIME  註解只保留在內存中
4、 @target  表示自定義註解應用的範圍
  @Target(ElementType.METHOD)   ---  方法上
  @Target(ElementType.TYPE)     ---  類上
5、註解可標 聲明在包、類、字段、方法、局部變量、方法參數等的前面
用來對這些元素進行說明,註釋。它的作用非常的多
例如:進行編譯檢查、生成說明文檔、代碼分析等。
6、要實現一個自定義註解,必須通過 @interface 關鍵字來定義。且在 @interface 之前,
需要通過元註解來描述該註解的使用範圍( @Target )、生命週期( @Retention )
6、註解可以看成是一個接口,註解實例就是一個實現了該接口的動態代理類。
7、註解大多是用做對某個類、方法、字段進行說明,標識的。
以便在程序運行期間我們通過反射獲得該字段或方法的註解的實例,
來決定該做些什麼處理或不該進行什麼處理  
8、註解的使用分爲三個過程: 定義註解-->聲明註解-->得到註解
(下詳細)
9、註解很重要。
-------------------------------------------------------
一個註解,就是一個類  註解相當於是一個胸牌
 【註解非常重要,能感覺到其作用不僅僅源於註釋,和我所學到的下面的知識,
當註解結合反射技術肯定能讓我做太多的事情】
 
 @SuppressWarnings       取消顯示指定的編譯器警告。
 @Deprecated                     過時,或者通常是因爲它很危險或存在更好的選擇。
 @Override                            一個方法聲明打算重寫超類中的另一個方法聲明。
 
 註解 相當於一個標記,加了註解就等於搭上了某種標記
沒加,則等於沒有某種標記,以及歐,java 編譯器開發工具和其他程序可以用發射來了解
你的類及各種元素上有無任何標記,看你的有什麼標記,就去幹相應的事,
 
 標記可以聲明在包、類、字段、方法、局部變量、方法參數等的前面
用來對這些元素進行說明,註釋。它的作用非常的多
例如:進行編譯檢查、生成說明文檔、代碼分析等。

註解可以有哪些成員
註解和接口相似,它只能定義final 靜態屬性和公共抽象方法。
註解的方法
1.方法前默認會加上public abstract
2.在聲明方法時可以定義方法的默認返回值。
列如
	String color() default "blue";		>>
		public abstract String color() default "blue";
	String[] color() default {"blue", "red",......}		>>
		public abstract String[] color() default {"blue", "red",......}
註解的使用分爲三個過程。


定義註解-->聲明註解-->得到註解


a. 定義註解(參照上面的註解定義)
b. 聲明註解
1. 在哪些元素上聲明註解
如果定義註解時沒有指定@Target 元註解來限制它的使用範圍,
那麼該註解可以使用在ElementType 枚舉指定的任何一個元素前。
否則,只能聲明在@Target 元註解指定的元素前。
一般形式:
@註解名()
2. 對註解的方法的返回值進行賦值
對於註解中定義的每一個沒有默認返回值的方法,
在聲明註解時必須對它的每一個方法的返回值進行賦值。
一般形式:
@註解名(方法名=方法返回值,......)
如果方法返回的是一個數組時,那麼將方法返回值寫在{}符號裏
@註解名(方法名={返回值1,返回值2,......},......)
3. 對於只含有value 方法的註解,在聲明註解時可以只寫返回值。


c. 得到註解
對於生命週期爲運行期間的註解,都可以通過反射獲得該元素上的註解實例。
1、聲明在一個類中的註解
可以通過該類Class 對象的getAnnotation 或getAnnotations 方法獲得
2、聲明在一個字段中的註解
通過Field 對象的getAnnotation 或getAnnotations 方法獲得
3、聲明在一個方法中的註解
通過Method 對象的getAnnotation 或getAnnotations 方法獲得
//	註解類
	@interface A{}
// 應用了註解類 -- 的類
		 @A
		 class B{}
//對 --應用了註解類  --的類
	 	class C{
			B.class.isAnnotationPresent{
	 			A.class;
	 		}
	 		A a = B.class.getAnnotation(A.class);
	 
	 	}
【】1、 生命週期
一個註解的聲明週期有3個階段對應@Retention  元註解
1、Java源文件 -------------->RetentionPolig.SOURCR   註解只保留在源文件中
2、class文件 -------------->RetentionPolig.CLASS    註解只保留在class文件中
3、內存中的字節碼   -------------->RetentionPolig.RUNTIME  註解只保留在內存中



思考:      這三個註解在什麼階段
 @SuppressWarnings 
 @Deprecated 
 @Override
 
 【】2、 類型     Type
1、class      2、interface      3、enum     4、@Interface
 他們有點像類,但又不是類,  他們是java 中的一個類型
 
 【】3、適用範圍
 @target 元註解,表示自定義註解應用的範圍
 @Target(ElementType.METHOD)   ---  方法上
 @Target(ElementType.TYPE)     ---  類上
 
 爲註解增加屬性
   設值的時候,當作方法。   賦值的時候, 當作屬性,調用時 是方法
public @Interface ItcastAnnotation{
   		String color();
	}
   @ItcastAnnotation(color: "red");

public class AnnotationTest{
	public static void main(String []args){
		if(AnnotationTest.class.isAnnotationPresent(ItacaseAnnotation.class)){
			ItcastAnnotation ia = ()AnnotationTest.getA
		}
	}
} 
要實現一個自定義註解,必須通過 @interface 關鍵字來定義。
且在 @interface 之前,需要通過元註解來描述該註解的使用範圍( @Target )、生命週期( @Retention )
【自定義註解】
【A】自定義註解類 
//
//1、通過註解設定 本註解 處於RUNTIME  運行時的階段
@Retention(RetentionPolicy.RUNTIME)
//1-2  通過 @interface  自定義一個註解
public @interface ItcastAnnotation {
	// 爲註解添加 屬性
	
	//2   添加一個color    並通過 default 設定  缺省值(即默認的值)
	String color() default "blue"; 
	//3   value 比較 特殊,單獨時,可以直接寫值 ,不用 value=""
	String value();//
	//4  添加一個    數組類型 沒有  缺省值
	int [] arrayAttr();
	//5  枚舉 類型  之前 專注總結 枚舉的時候,寫過的一個高級枚舉:
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
	//6 註解類型  註解中的註解     設定  缺省值
	MetaAnnotation annotationAttr() default @MetaAnnotation("mmmmmmmm");
	//7  添加一個 Class字節碼文件
	Class className();
}
【B】 ItcastAnnotation 的測試類 
//1、使用自定義註解 @ItcastAnnotation,其中有很多屬性   
@ItcastAnnotation(annotationAttr=@MetaAnnotation("aaaaa"),value = "abc",arrayAttr=2,className=String.class)
public class AnnotationTest {
	
	//2				 特殊屬性(方法) value
	//@ItcastAnnotation("abc")//當註解方法只有value、或者其他都有缺省時,可以這麼寫
	public static void main(String[] args) throws Exception
	{ 
		// TODO Auto-generated method stub
		//3-1、過時的方法
		System.runFinalizersOnExit(true);
		//3-3、設置方法過時
		sayHelle();
		//4-1、(證明註解也是一個類)。
		//      先得到AnnotationTest字節碼                           檢測是否有註解               
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
			//4-2  既然註解是一個類,  創建一個對象
			ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			//System.out.println(annotation);
			//4-3 color 在應用註解的時候沒有設值  所以這裏會引用 缺省值
			System.out.println("color:   "+annotation.color());
			System.out.println("value:   "+annotation.value());
			
			System.out.println("arrayAttr.length:  "+annotation.arrayAttr().length);
			//4-4  把arrayAttr  進行轉換 ,並打印
			List<int []> lists = Arrays.asList(annotation.arrayAttr());
			
			for(int [] list : lists){
				for(int li : list){
					System.out.print(li+"   >");
				}
			}
			 //4-5  枚舉 類型  之前 專注總結 枚舉的時候,寫過的一個高級枚舉
			System.out.println("\nEnumTest.TrafficLamp:  "+annotation.lamp().nextLamp().name());
			
			//4-6   註解中的  註解
			System.out.println("annotationAttr.value:   "+annotation.annotationAttr().value());
		}
	}
	//3-2、設置方法過時
	@Deprecated
	public static void sayHelle(){
		System.out.println("唉,哥輝煌的時代已然過去鳥。");
	}
註解可以看成是一個接口,註解實例就是一個實現了該接口的動態代理類。

註解大多是用做對某個類、方法、字段進行說明,標識的。
以便在程序運行期間我們通過反射獲得該字段或方法的註解的實例,
來決定該做些什麼處理或不該進行什麼處理  





---------------------------------------------------------------------------------------------------------------------------------------------
---------- android培訓、 java培訓、期待與您交流!----------


----------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章