java 注解使用_Java 注解用法
Java 注解用法
1、簡述
Annontation是Java5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata) 與程序元素(類、方法、成員變量等)進行關聯。
Annontation像一種修飾符樣,應用于包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。
2、基本Annontation
java提供五個基礎的annontation類型
@Override
此注解作用于方法,作用于此方法的注解,意味此方法受重寫規則的約束,否則不能編譯成功
@Deprecated
作用于方法,標注此方法過時
@SuppressWarnings
對于某些不想看到的警告信息,可以通過這個注解來屏蔽
@SafeVarargs
抑制類型轉換異常的警告信息,只能用在參數長度可變的方法或構造方法上,且方法必須聲明為static或final,否則會出現編譯錯誤。一個方法使用@SafeVarargs注解的前提是,開發人員必須確保這個方法的實現中對泛型類型參數的處理不會引發類型安全問題。
@FunctionalInterface
Java 8為函數式接口引入的一個新注解,主要用于編譯級錯誤檢查,加上該注解,當你寫的接口不符合函數式接口定義的時候,編譯器會報錯。保證該接口只能包含一個抽象方法
3、自定義注解
4、getAnnotation方法
獲取作用于元素上的單個注解對象
4.1、獲取類注解屬性值
/**
* 自定義注解
*/
@Retention(RetentionPolicy.RUNTIME)//生命周期
@Target(ElementType.TYPE)//作用范圍
public @interface Myannontation {
String value();
}
?
/**
* 將自定義注解作用在People類
*/
@Myannontation("people")
public class People {
?
}
?
/**
* 測試類
*/
public class Test {
?
public static void main(String[] args) throws ClassNotFoundException {
//獲取Class對象
Class peopleClass=Class.forName("com.yl.annontation.People");
//獲取注解
Myannontation myannontation= (Myannontation) peopleClass.getAnnotation(Myannontation.class);
//獲取注解值
String value=myannontation.value();
System.out.println(value);
}
?
}
4.2、獲取方法注解屬性值
/**
* 自定義注解
*/
@Retention(RetentionPolicy.RUNTIME)//生命周期
@Target(ElementType.METHOD)//作用范圍
public @interface Myannontation {
String value();
}
?
/**
* 將自定義注解作用在show方法
*/
?
public class People {
?
@Myannontation("show")
public void show(){}
}
?
/**
* 測試類
*/
public class Test {
?
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//獲取Class對象
Class peopleClass=Class.forName("com.yl.annontation.People");
//獲取show方法
Method showMethod=peopleClass.getMethod("show");
//獲取注解
Myannontation myannontation= (Myannontation) showMethod.getAnnotation(Myannontation.class);
//獲取注解值
String value=myannontation.value();
System.out.println(value);
}
?
}
4.3、獲取屬性注解屬性值
/**
* 自定義注解
*/
@Retention(RetentionPolicy.RUNTIME)//生命周期
@Target(ElementType.FIELD)//作用范圍
public @interface Myannontation {
String value();
}
?
/**
* 將自定義注解作用在屬性
*/
?
public class People {
@Myannontation("name")
public String name;
}
?
/**
* 測試類
*/
public class Test {
?
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {
//獲取Class對象
Class peopleClass=Class.forName("com.yl.annontation.People");
//獲取name屬性
Field nameField=peopleClass.getField("name");
//獲取注解
Myannontation myannontation= (Myannontation) nameField.getAnnotation(Myannontation.class);
//獲取注解值
String value=myannontation.value();
System.out.println(value);
}
?
}
?
5、getAnnotations方法
獲取作用于元素上的所有注解對象,包括父類注解
/**
*自定義注解1
*/
@Retention(value=RetentionPolicy.RUNTIME)//生命周期
@Target({ElementType.METHOD})//作用范圍
@interface Anno{
//定義一個成員
String value();
}
?
/**
*自定義注解2
*/
@Retention(value=RetentionPolicy.RUNTIME)//生命周期
@Target({ElementType.METHOD})//作用范圍
@interface Anno2{
//定義一個成員
String value();}
?
/**
*將自定義注解作用在方法上
*/
class MyTest{
@Anno(value="張三")
@Anno2(value="李四")
public void info(){}
}
?
public class MainTest {
?
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
//獲取MyTest類的Class對象
Class myTestCls=(Class) Class.forName("getannotation方法使用.MyTest");
//獲取info方法的對象
Method infoM=myTestCls.getMethod("info", null);
//獲取作用于元素上的所有注解對象
Annotation[] annotatinArrays=infoM.getAnnotations();
//遍歷annotatinArrays
for(Annotation annoObj:annotatinArrays){
if(annoObj instanceof Anno){
System.out.println("注解的元數據值="+((Anno)annoObj).value());
}else if(annoObj instanceof Anno2){
System.out.println("注解的元數據值="+((Anno2)annoObj).value());
}
}}
}
6、isAnnotationPresent方法
此方法判斷元素是否作用注解,如果此方法作用于此注解,則返回true,否則返回false
/**
*自定義注解
*/
@Retention(value=RetentionPolicy.RUNTIME)//生命周期
@Target({ElementType.METHOD})//作用范圍
@interface Anno{
//定義一個成員
String value();
}
?
/**
*自定義注解
*/
@Retention(value=RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@interface Anno2{
//定義一個成員
String value();
}
?
class MyTest{
public void info(){}
public void info2(){}
@Anno(value="張三")
public void info3(){}
}
?
public class MainTest {
?
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
//獲取MyTest類的Class對象
Class myTestCls=(Class) Class.forName("getannotation方法使用.MyTest");
//獲取info方法的對象
Method infoM=myTestCls.getMethod("info", null);
System.out.println(infoM.isAnnotationPresent(Anno.class));//fasle
}
?
}
7、getDeclaredAnnotations方法
返回直接存在于此元素上的注解,即不包括從父類繼承過來的注解。比較簡單理解,不寫代碼案例了。
8、@Retention
@Retention是Java 1.8 才加進來的,所以算是一個新的特性
Repeatable的英文意思是可重復的。顧名思義說明被這個元注解修飾的注解可以同時作用一個對象多次,但是每次作用注解又可以代表不同的含義。
下面我們看一個人玩游戲的例子
/**一個人喜歡玩游戲,他喜歡玩英雄聯盟,絕地求生,極品飛車,塵埃4等,則我們需要定義一個人的注解,他屬性代表喜歡玩游戲集合,一個游戲注解,游戲屬性代表游戲名稱*/
/**玩家注解*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface People {
Game[] value() ;
}
?
/**游戲注解*/
@Repeatable(People.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Game {
String value();
}
?
/**玩游戲類*/
@Game(value = "LOL")
@Game(value = "PUBG")
@Game(value = "NFS")
@Game(value = "Dirt4")
public class PlayGame {
}
?
/**
*測試類,獲取注解屬性值
*/
public static void main(String[] args) throws ClassNotFoundException {
//獲取Class對象
Class playClass=Class.forName("com.yl.annontation.PlayGame");
//獲取注解
People people= (People) playClass.getAnnotation(People.class);
//獲取注解值
Game[] value=people.value();
//輸出注解值
System.out.println(Arrays.toString(value));
}
/**
*@Game會存入@People的Game[]中
*@Game必須要有一個屬性名為value,@People也是
*/
9、編譯時處理Annotation
處于RetentionPolicy.CLASS生命周期的注解信息,如何提取?
問題就是當處理CLASS階段的注解信息,會在運行期間之前就丟失,因此不能通過運行期間的反射機制提取數據
但是可以通過APT工具,在javac期間提取處于編譯時的注解數據信息
具體如何實現
/**
*創建一個處于編譯期間的注解
*/
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface MyAnno {
String value();
}
?
/**
*注解作用于類
*/
@MyAnno(value="red apple")
public class Apple {}
?
@SupportedSourceVersion(SourceVersion.RELEASE_8)//設置jdk版本
@SupportedAnnotationTypes("apt.MyAnno") //設置自定義注解
public class MyAnnotationProcess extends AbstractProcessor {
/**
*重寫核心方法:注解處理器,當javac調用apt工具觸此處理器
*/
@Override
public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv){
//獲取根節點信息
for (Element rootElement : roundEnv.getRootElements()) {
//如果此根節點標注注解信息并且屬于類
if(rootElement.getKind()== ElementKind.CLASS) {
//獲取注解類對象
MyAnno annTest=rootElement.getAnnotation(MyAnno.class);
if(annTest!=null) {
System.out.println("將編譯時的注解元 數據提取="+annTest.value());
}
}
}
return false;
}
}
如何通過apt編譯
javac -d . MyAnnotationProcess.java
javac -d . *.java -processor apt.MyAnnotationProcess
最終輸出結果
總結
以上是生活随笔為你收集整理的java 注解使用_Java 注解用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中兴发布 FTTR 家庭网关 G8615
- 下一篇: 离线java人脸识别开源算法_Java