為什么要學習注解?學習注解有什么好處?學完能做什么?
? ? 1、能夠讀懂別人寫的代碼,特別是框架相關的代碼
? ? 2、讓編程更加簡潔,代碼更加清晰
? ?3、讓別人高看一眼
概念:
注解是一種這樣的東西,標志是一個@符號,他能夠關聯數據和其他的信息,
比較正規一點的描述是:
? ? ? ? Java提供了一種程序中的元素關聯任何信息和任何元數據的途徑和方法。
java中的常見注解
JDK自帶注解
? ? ? ? ?@Override? 覆蓋父類方法
? ? ? ? ?@Deprecated? 這個方法過時了
? ? ? ? ? @suppressWarings("deprecation")? 忽略警告
常見第三方注解
? ? ? ? ? ? ? ? ? ? @Autowired
? ? ? Spring: ? @Service
? ? ? ? ? ? ? ? ? ? @Repository
? ? ? ? ? ? ? ? ? ? @InsertProvider
? ? Mybatis:? @UpdateProvider
? ? ? ? ? ? ? ? ? ? ?@Options
注解的分類
按照運行機制分
? ? ? ? ? ? ?1.源碼注解? ——只存在于源碼中,編譯成.class文件就不存在了
? ? ? ? ? ? ?2.編譯時注解——源碼和.class文件中均存在 如:@override @deprecated等jdk自帶的注解
? ? ? ? ? ? 3.運行時注解——運行階段仍然會起作用,甚至會影響運行邏輯的注解,如:spring的autowired
按照注解來源分類
? ? ? ? ? ?jdk自帶注解
? ? ? ? ? ? 第三方注解
? ? ? ? ? ? 自定義注解
元注解:注解的注解叫元注解
自定義注解:
注解語法規則
? ? ? ? ? //@Target 注解的作用域(
? ? ? ? ? ? ? ? ? ? ? ? ? ?CONSTRUCTOR? ? //構造方法聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? FIE LD ? //字段聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? LOCAL_VARIABLE //局部變量聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?METHOD? ? ? ? //方法聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PACKAGE? ? ? ? //包聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PARAMETER? ? ? //參數聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE? ? ? ? ? //類接口
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?)
@Target({ElementType.METHOD,ElementType.TYPE})
? ? ? ? ? ? //@Retention生命周期(
? ? ? ? ? ? ? ? ? ? ? ? ? ?SOURCE? :只在源碼顯示,編譯時會丟棄
? ? ? ? ? ? ? ? ? ? ? ? ? ?CLASS? :編譯時會記錄到class中,運行時忽略
? ? ? ? ? ? ? ? ? ? ? ? ? ?RUNTIME :運行時存在,可以通過反射讀取
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?)
@Retention(RetentionPolicy.RUNTIME)
@Inherited? 運行子類繼承 (必須是子類實現父類,且父類有注解;才會繼承類上面的注解)
@Documented? 生成javadoc是會包含注解
//上面這4行 就是元注解
public @interface Description{? ? //使用@interface關鍵字定義注解
? ? ? ? ? ? ? ? String desc();? ——成員以無參無異常方式聲明
? ? ? ? ? ? ? ?String author();
? ? ? ? ? ? ? int age() default 18; ——可以使用default為成員指定一個默認值
}
注意
? ? ? ? ? ?成員類型是受到限制的,合法的類型包括原始類型及String,Class,Annotation,Enumeration
? ? ? ? ? 如果注解只有一個成員,則成員名必須取名為value(),在使用時可以忽略成員名和賦值號(=)
? ? ? ? ? ?注解類可以沒有成員,沒有成員的注解稱為標識注解
使用自定義注解
使用注解的語法:
? ? ? ? ? @<注解名>(<成員名1>=<成員值1>,<成員名2>=<成員值2>,......)
@Description(desc="I am jxb",author="Mooc boy",age=18)
? ? ? ? public String eyeColor(){
? ? ? ? ? ? ? ? ?return "red";
? ? ? ? ? ?}
解析注解
? ? ? 通過反射獲取類,函數或成員上的運行時注解信息,從而實現動態控制程序的運行邏輯。
解析子類的注解:
解析父類的注解:
其他代碼與上面一樣,只需要修改Child和Person類
自己學習筆記整理,不足之處望原諒!