摘要:定義注解,也叫元數據。它可以聲明在包類字段方法局部變量方法參數等的前面,用來對這些元素進行說明,注釋。方法返回該程序元素上存在的所有注解。與此接口中的其他方法不同,該方法將忽略繼承的注釋。
定義:
注解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK5.0及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。
它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。(“java注解”百度百科)
作用分類:
①編寫文檔:通過代碼里標識的元數據生成文檔
②代碼分析:通過代碼里標識的元數據對代碼進行分析
③編譯檢查:通過代碼里標識的元數據讓編譯器能過實現基本的編譯檢查
元注解:
元注解的作用就是注解其他注解。java5.0定義了4個標準的meta-annotation類型,用以對其他的annotation類型做說明,他們分別是:
@Target:
說明了Annotation所修飾的對象的作用:用戶描述注解的使用范圍(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
@Retention:
作用:表示需要在什么級別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內有效)
取值(RetentionPolicy)
1.SOURCE:在源文件中有效
2.CLASS:在class文件中有效
3.RUNTIME:在運行時有效
取RUNTIME時,注解處理器可以通過反射,獲取到該注解的屬性值,做一些運行時的邏輯處理。
@Documented:
這是一個標記注解
用于描述其它類型的annotation應該被作為標注的程序成員的公共api,可以文檔化
@Inherited:
標記注解
用該注解修飾的注解,會被子類繼承。
自定義注解:
使用@interface來聲明一個注解。其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱。返回值的類型就是參數的類型。(返回值只能是基本類型、class、String、enum),可以用default來聲明參數的默認值.
格式
public @interface 注解名 {定義體}
注解參數支持的數據類型:
1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
2.String類型
3.Class類型
4.enum類型
5.Annotation類型
6.以上所有類型的數組
只能用public或者default這兩個訪問權修飾.注解元素必須有確定的默認值,要么在定義的時候指定,要么在使用的時候指定。
例子:
</>復制代碼
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//用于描述域
@Target(ElementType.FIELD)
// 運行是有效
@Retention(RetentionPolicy.RUNTIME)
public @interface Student {
public enum Sex {
MAN, WOMAN
}
/**
* 1.參數成員只能用基本類型String,Enum,Class,annotations等數據類型,以及這一些類型的數組
* 2.只能用public或默認(default)這兩個訪問權修飾. 3.如果只有一個參數成員,最好把參數名稱設為"value"
*/
String name() default "";
// public修飾
public int age() default 18;
public Sex sex() default Sex.MAN;
}
注解處理器
這是一個自己編寫的工具類,通過注解處理器對程序元素中的注解進行操作。
獲得Annotation信息的方法:
方法1: T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定類型的注解,如果該類型注解不存在,則返回null。
方法2:Annotation[] getAnnotations():返回該程序元素上存在的所有注解。
方法3:boolean is AnnotationPresent(Annotation):判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.
方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
</>復制代碼
public class StudentInfoUtil {
public static void getStudentInfo(Class clazz) {
// 獲取程序對象所有的Field注釋
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 判斷是否為Student注釋
if (field.isAnnotationPresent(Student.class)) {
// 獲取Annotation對象
Student student = field.getAnnotation(Student.class);
System.out.println("姓名" + student.name() + "年齡" + student.age()
+ "性別" + student.sex());
}
}
}
}
下面寫個實例看它怎么用,先寫一個student實體bean
</>復制代碼
public class StudentBean {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
再寫個測試
</>復制代碼
public class Test {
@Student(name = "Snail", age = 18, sex = Sex.MAN)
private StudentBean student01;
@Student(name = "Snail2", age = 19, sex = Sex.MAN)
private StudentBean student02;
public static void main(String[] args) {
StudentInfoUtil.getStudentInfo(Test.class);
}
}
輸出如下:
</>復制代碼
姓名Snail年齡18性別MAN
姓名Snail2年齡19性別MAN
可以看到,這里注解可以省去重復聲明賦值的麻煩。
參考
深入理解Java:注解(Annotation)自定義注解入門
深入理解Java:注解(Annotation)--注解處理器
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64177.html
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
摘要:跟兩年前寫和配置相關的文件相比,這真是十分的簡單了。可以試著寫一個小小的,有很多視頻教程跟著一步步做就成,我是跟著慕課網上的視頻學習的。對于寫快一年的我來說初學這個還是很欣喜的。 環境配置 Mac 上搭建 java 開發環境http://starzhou.com/blogs/jav... 初始化項目 參考鏈接http://start.spring.io/ 從此鏈接中輸入項目名,并選擇相...
摘要:初步使用注入對象沿用上次的工程新建兩個類和修改其中用來標記注入,將注入到中執行結果如下采用注解方式注入對象修改和,加入注解,并賦予默認值為類加上注解,即表明此類是為類加上注解,即表明此類是修改,刪除所有子標簽,加入自動掃描執行結果 Spring初步使用 注入對象 沿用上次的工程新建兩個類Category和Product Category.java public class Catego...
閱讀 2249·2021-11-24 11:15
閱讀 3100·2021-11-24 10:46
閱讀 1400·2021-11-24 09:39
閱讀 3934·2021-08-18 10:21
閱讀 1488·2019-08-30 15:53
閱讀 1402·2019-08-30 11:19
閱讀 3336·2019-08-29 18:42
閱讀 2333·2019-08-29 16:58
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要