文章目錄
- 一、注解的概念
- 1、注解官方解釋
- 2、注解與注釋的區別
- 二、內置注解與元注解
- 1、常用的內置注解
- 2、常用的元注解
- 三、自定義注解
- 1、自定義注解基礎知識
- 2、演示自定義注解的使用
- 4、演示注解在程式中的作用
一、注解的概念
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+" ");
}
}
}
- 運行結果

4、演示注解在程式中的作用
兩個方法:
- 類物件呼叫
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.運行結果

?????????????????????
感謝各位的來訪,有什么錯誤的地方可以指出來喔,共同交流共同進步,
一鍵三連就是大家對博主最大的支持!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/275463.html
標籤:java
