註解 Annotation
1、什麼是註解?
-
Annotation 是從 JDK5.0 開始引入的新技術
-
Annotation的作用:
不是程序本身,可以對程序作出解釋(這一點和註解 comment 沒什麼區別)
可以被其他程序(比如:編譯器等 )讀取 -
Annotation的格式:
註解是以“@註釋名”在代碼中存在的,還可以添加一些參數值,例如-抑制警告:@SuppressWarnings(value=“unchecked”) -
Annotation 在哪裏使用?
可以附加在package、class、method、field 等上面,相當於給他們添加了額外的輔助信息,我們可以通過反射機制變成實現對這些元數據的訪問
2、內置註解
@Override
@Override(重寫):定義在 java.lang.Override中
表示方法聲明旨在覆蓋
超類型中的方法聲明。 如果使用此註釋類型註釋方法,則除非至少滿足以下條件之一,否則需要編譯器生成錯誤消息:
- 該方法將覆蓋或實現在超類型中聲明的方法
- 該方法具有與Object中聲明的任何公共方法的覆蓋相同的簽名
@Deprecated
@Deprecated (已過時的):定義在 java.lang.Deprecated 中
-
註釋@Deprecated的程序元素是程序員不鼓勵使用的程序元素,通常是因爲它是危險的,或者因爲存在更好的替代方法
-
編譯器在不被棄用的代碼中使用或覆蓋不推薦使用的程序元素時發出警告。
@SuppressWarning
@SuppressWarning(抑制警告):定義在 java.lang.SuppressWarning中
- 表示在註釋元素(以及註釋元素中包含的所有程序元素)中應該抑制命名的編譯器警告。 請注意,給定元素中抑制的一組警告是所有包含元素中抑制的警告的超集。 例如,如果您註釋一個類來抑制一個警告並註釋方法來抑制另一個警告,則兩個警告將在該方法中被抑制。
- 作爲一種風格,程序員應該始終將這個註釋用於最有效的嵌套元素。 如果要在特定方法中抑制警告,則應該註釋該方法而不是其類
不同參數的用法 |
---|
@SuppressWarning(“all”) |
@SuppressWarning(“unchecked”) |
@SuppressWarning(value={“unchecked”,“deprecation”}) |
3、元註解 (4個 meta-annotation)
什麼是元註解?
元註解的作用就是負責註解其他註解
Java定義了4個標準的meta-annotation類型,他們被用來提供對其他annotation類型作說明
這些類型和他們所支持的類在java.lang.annotation 包中可以找到
@Target
Target:用於描述註解的使用範圍(即:被描述的註解可以用在設麼地方)
@Retention
Retention:表示需要在什麼級別保存該註釋信息,用於描述註解的生命週期
SOURCE > CLASS > RUNTIME
@Document
Document:說明該註解將被包含在 javadoc 中
@Inherited
Inherited:說明子類可以繼承父類中的該註解
4、自定義註解
使用@interface 自定義註解時,自動繼承了 java.lang.annotation.Annotation 接口
1. 定義一個註解
@interface 用來聲明一個註解
格式:public @interface 註解名稱 {定義內容}
public @interface MyAnnotation{
}
2. 註解的參數
格式:註解的參數: 參數類型 + 參數名();
可以通過default 來聲明參數的默認值
@interface MyAnnotation{
int age();
String name() default "";
}
☆ 自定義註解,如果只有一個參數,且將這個參數定義爲 value
則不需要在使用時聲明參數
public class test04 {
@MyAnnotation1(1)
public void test(){}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1{
int value();
}
如果沒有將參數定義爲value
,調用時不聲明參數則報錯
註解元素必須要有值,我們定義註解元素時,經常使用空字符串,0作爲默認值
3. 註解的返回值
返回值類型就是參數的類型(返回值只能是基本類型、class、string、enum)
5、自定義註解練習代碼
爲了方便練習,這裏創建註解採用的是內部類的方式(省略了 public 的@interface )
package com.ctra.annotation;
import javax.xml.bind.annotation.XmlType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 自定義註解
public class test03 {
// 註解可以顯示賦值,如果沒有默認值,我們就必須給註解賦值
@MyAnnotation(age=12)
public void test(){}
@MyAnnotation2(1)
public void test2(){}
}
@Target({ElementType.TYPE,ElementType.METHOD}) //作用域
@Retention(RetentionPolicy.RUNTIME) //作用範圍
@interface MyAnnotation{
// 註解的參數: 參數類型 + 參數名();
String name() default "";
int age() ;
int id() default -1;
String[] schools() default {"a","b"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
int value();
}