詳解Java進階知識註解
一、註解的概念
1、註解官方解釋
註解
叫元數據,一種代碼級別的說明,它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉在同一個層次,它可以聲明在包、類、字段、局部變量、方法參數等的前面,用來對這些元素進行說明、註釋。
註解的作用分類
- 編寫文檔:通過代碼裡表示的元數據生成文檔【生成doc文檔】
- 代碼分析:通過代碼裡表示的元數據進行分析【使用反射】
- 編譯檢查:通過代碼裡表示的元數據讓編譯器能夠實現基本的編譯檢查【Override】
註解按照運行機制分類
- 源碼註解:註解隻在源碼中存在,編譯成.class文件之後就不存在瞭
- 編譯時註解:註解在源碼存在的基礎上,也會在.class文件中存在,但是在運行階段中就不存在瞭,例如:@Override
- 運行時註解:註解在運行階段依然存在,且能夠影響程序的運行過程,例如:@Autowired
2、註解與註釋的區別
(1)註解:用於描述代碼,說明程序,主要目的是為瞭給計算機看,且能夠影響程序的運行。
(2)註釋:用於描述代碼的作用和一些關鍵性的知識點,使用文字描述程序,是為瞭給程序員觀看,以此來使程序員能夠以最快的時間瞭解被註釋的代碼。
二、內置註解與元註解
1、常用的內置註解
- @Override:檢測該註解標記的方法是否繼承自父類;
- @Deprecated:說明被標記的內容已過時,暗示著在不久之後可能會被更新抹除;
- @SuppressWarnings:壓制警告,就是被標記的部分不會產生警告,常用的參數:@SuppressWarnings(“all”);
- @SafeVarargs:參數安全類型註解,它的目的就是提醒開發者不要用參數做一些不安全的操作,它的存在會阻止編譯器產生unchecked這樣的警告;
2、常用的元註解
元註解:用於描述註解的註解,在創建註解時使用
1. @Target屬性值:
- ElementType.TYPE:能修飾類、接口或枚舉類型
- ElementType.METHOD:能修飾方法
- ElementType.FIELD: 能修飾成員變量
- ElementType.PARAMETER:能修飾參數
- ElementType.CONSTRUCTOR:能夠修飾構造器
- ElementType.ANNOTATION_TYPE:能夠修飾註解
- ElementType.PACKAGE:能夠修飾包
- ElementType.LOCAL_VARIABLE:能夠修飾局部變量
2.@Retention屬性值:
- RetentionPolicy.SOURCE:註解隻在源碼中存在,編譯成class之後就沒瞭
- RetentionPolicy.CLASS:註解在源碼和class中都存在,運行時就沒瞭,這個是Retention的默認值
- RetentionPolicy.RUNTIME: 註解在源碼、class、運行時都存在,如果要使用反射一定要定義為這種類型
3.@Documented:該註解的作用就是表示此註解標記的註解可以包含到javadoc文件中去
4.@Inherited:描述註解是否能夠被子類所繼承
三、自定義註解
1、自定義註解基礎知識
1.格式:
@Inherited//元註解public @interface zhujie{}
2.註解本質:註解的本質上就是一個接口,該接口默認繼承Annotation
public interface MyAnno extends java.lang.annotation.Annotion
3.屬性:接口中可以定義的內容(成員方法、抽象方法)
屬性的返回值:
- 八種基本數據類型
- 字符串類、接口、枚舉
- 註解
- 以上類型的數組
屬性賦值註意事項
- 如果定義屬性時,使用default關鍵字給屬性默認初始化值,則使用註解時,就可以不進行屬性的賦值,否則都必須給屬性賦值
- 如果隻有一個屬性需要賦值的話,並且屬性的名稱是value,則使用註解給屬性賦值時,value可以省略,直接定義值就可以瞭
- 數組賦值時,值需要使用{}包裹,如果數組中隻有一個值,則{}可以省略不寫
2、演示自定義註解的使用
自定義註解annotation
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = ElementType.TYPE) public @interface annotation { String name() default "木魚"; int age(); int[] score(); }
使用以上註解的類TestAnnotation
//name具有默認值,不需要必須為name賦值,但也可以重新賦值 @annotation(age=20,score={99,100,100}) public class TestAnnotation { public static void main(String[] args) throws ClassNotFoundException { Class clazz = Class.forName("test.TestAnnotation"); annotation annotation = (annotation) clazz.getAnnotation(annotation.class); System.out.println("姓名:"+annotation.name()+" 年齡:"+annotation.age()); System.out.print("成績為:"); int[] score=annotation.score(); for (int score1:score){ System.out.print(score1+" "); } } }
運行結果
3、演示註解在程序中的作用
兩個方法:
- 類對象調用
isAnnotationPresent(Class<? extends Annotation> annotationClass)
判斷是否應用瞭某個註解 - 通過getAnnotation()方法獲取Annotation對象,或者getAnnotations()方法獲取所有應用在該類上的註解
1.創建自定義註解
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = ElementType.FIELD) public @interface StringNull { }
2.創建實體類
public class Student { @StringNull public String name=null; @StringNull public String xuehao=null; @StringNull public String sex=null; public void setName(String name) { this.name = name; } public void setXuehao(String xuehao) { this.xuehao = xuehao; } public void setSex(String sex) { this.sex = sex; } }
3.創建測試類,測試註解
public class TestAnnotation { public static void main(String[] args) throws Exception{ Class clazz = Class.forName("test.Student"); Student student =(Student) clazz.newInstance(); student.setName("小明"); Field[] fields= clazz.getFields(); for(Field f:fields){ if(f.isAnnotationPresent(StringNull.class)){ if(f.get(student)==null){ System.out.println(f.getName()+":是空的字符串屬性"); }else{ System.out.println(f.getName()+":"+f.get(student)); } } } } }
4.運行結果
以上就是詳解Java進階知識註解的詳細內容,更多關於Java註解的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found