註解 Annotation
---------------------------------------------------------------------------------------------------------------------------------------------
註解
1、一個註解,就是一個類,相當於是一個標記,什麼樣的標記,幹什麼樣的事兒。
2、常見的註解
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、註解大多是用做對某個類、方法、字段進行說明,標識的。
7、註解大多是用做對某個類、方法、字段進行說明,標識的。
以便在程序運行期間我們通過反射獲得該字段或方法的註解的實例,來決定該做些什麼處理或不該進行什麼處理
8、註解的使用分爲三個過程: 定義註解-->聲明註解-->得到註解
(下詳細)
9、註解很重要。
-------------------------------------------------------
-------------------------------------------------------
一個註解,就是一個類 註解相當於是一個胸牌
【註解非常重要,能感覺到其作用不僅僅源於註釋,和我所學到的下面的知識,
【註解非常重要,能感覺到其作用不僅僅源於註釋,和我所學到的下面的知識,
當註解結合反射技術肯定能讓我做太多的事情】
@SuppressWarnings 取消顯示指定的編譯器警告。
@Deprecated 過時,或者通常是因爲它很危險或存在更好的選擇。
@Override 一個方法聲明打算重寫超類中的另一個方法聲明。
註解 相當於一個標記,加了註解就等於搭上了某種標記
沒加,則等於沒有某種標記,以及歐,java 編譯器開發工具和其他程序可以用發射來了解你的類及各種元素上有無任何標記,看你的有什麼標記,就去幹相應的事,
標記可以聲明在包、類、字段、方法、局部變量、方法參數等的前面
用來對這些元素進行說明,註釋。它的作用非常的多例如:進行編譯檢查、生成說明文檔、代碼分析等。
註解可以有哪些成員
註解和接口相似,它只能定義final 靜態屬性和公共抽象方法。
註解的方法
1.方法前默認會加上public abstract2.在聲明方法時可以定義方法的默認返回值。列如
String color() default "blue"; >>
public abstract String color() default "blue";
String[] color() default {"blue", "red",......} >>
public abstract String[] color() default {"blue", "red",......}
註解的使用分爲三個過程。
定義註解-->聲明註解-->得到註解
a. 定義註解(參照上面的註解定義)
b. 聲明註解
定義註解-->聲明註解-->得到註解
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
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】自定義註解類
【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培訓、期待與您交流!----------
----------------------------------------------