- Offer來了:Java面試核心知識點精講(原理篇)
- 王磊
- 981字
- 2020-04-03 12:50:10
2.4 注解
2.4.1 注解的概念
注解(Annotation)是Java提供的設置程序中元素的關聯信息和元數據(MetaData)的方法,它是一個接口,程序可以通過反射獲取指定程序中元素的注解對象,然后通過該注解對象獲取注解中的元數據信息。
2.4.2 標準元注解:@Target、@Retention、@Documented、@Inherited
元注解(Meta-Annotation)負責注解其他注解。在Java中定義了4個標準的元注解類型@Target、@Retention、@Documented、@Inherited,用于定義不同類型的注解。
(1)@Target:@Target說明了注解所修飾的對象范圍。注解可被用于packages、types(類、接口、枚舉、注解類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(循環變量、catch參數等)。在注解類型的聲明中使用了target,可更加明確其修飾的目標,target的具體取值類型如表2-1所示。
表2-1

(2)@Retention:@Retention定義了該注解被保留的級別,即被描述的注解在什么級別有效,有以下3種類型。
◎ SOURCE:在源文件中有效,即在源文件中被保留。
◎ CLASS:在Class文件中有效,即在Class文件中被保留。
◎ RUNTIME:在運行時有效,即在運行時被保留。
(3)@Documented:@Documented表明這個注解應該被javadoc工具記錄,因此可以被javadoc類的工具文檔化。
(4)@Inherited:@Inherited是一個標記注解,表明某個被標注的類型是被繼承的。如果有一個使用了@Inherited修飾的Annotation被用于一個Class,則這個注解將被用于該Class的子類。
2.4.3 注解處理器
注解用于描述元數據的信息,使用的重點在于對注解處理器的定義。Java SE5擴展了反射機制的API,以幫助程序快速構造自定義注解處理器。對注解的使用一般包含定義及使用注解接口,我們一般通過封裝統一的注解工具來使用注解。
1.定義注解接口
下面的代碼定義了一個FruitProvider注解接口,其中有name和address兩個屬性:
//1:定義注解接口
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
//供應商編號
public int id() default -1;
//供應商名稱
public String name() default "";
//供應商地址
public String address() default "";
}
2.使用注解接口
下面的代碼定義了一個Apple類,并通過注解方式定義了一個FruitProvider:
public class Apple {
//2:使用注解接口
@FruitProvider(id = 1, name = "陜西紅富士集團", address = "陜西省西安市")
private String appleProvider;
public void setAppleProvider(String appleProvider) {
this.appleProvider = appleProvider;
}
public String getAppleProvider() {
return appleProvider;
}
}
3.定義注解處理器
下面的代碼定義了一個FruitInfoUtil注解處理器,并通過反射信息獲取注解數據,最后通過main方法調用該注解處理器使用注解:
//3:定義注解處理器
public class FruitInfoUtil {
public static void getFruitInfo(Class<? > clazz) {
String strFruitProvicer = "供應商信息:";
Field[] fields = clazz.getDeclaredFields(); //通過反射獲取處理注解
for (Field field : fields) {
if (field.isAnnotationPresent(FruitProvider.class)) {
FruitProvider fruitProvider = (FruitProvider)
field.getAnnotation(FruitProvider.class);
//處理注解信息
strFruitProvicer = " 供應商編號:" + fruitProvider.id() +
" 供應商名稱:"+ fruitProvider.name() + " 供應商地址:"+
fruitProvider.address();
System.out.println(strFruitProvicer);
}
}
}
}
public class FruitRun {
public static void main(String[] args) {
FruitInfoUtil.getFruitInfo(Apple.class);
//輸出結果為:供應商編號:1 供應商名稱:陜西紅富士集團 供應商地址:陜西省西安市
}
}
- Git Version Control Cookbook
- Kali Linux Web Penetration Testing Cookbook
- 控糖控脂健康餐
- Python神經網絡項目實戰
- Mastering AndEngine Game Development
- Mastering JBoss Enterprise Application Platform 7
- Kotlin編程實戰:創建優雅、富于表現力和高性能的JVM與Android應用程序
- Learning OpenStack Networking(Neutron)(Second Edition)
- Android群英傳
- Functional Python Programming
- React and React Native
- H5頁面設計與制作(全彩慕課版·第2版)
- 菜鳥成長之路
- TensorFlow.NET實戰
- R for Data Science Cookbook