1特咆、概念
注解:(JDK1.5)
是Java提供的一種 源程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)的途徑和方法。
2、Java中的常見(jiàn)注解
JDK自帶注解
@Override 對(duì)父類方法的重寫
@Deprecated 表示接口中的方法已經(jīng)過(guò)時(shí)
@SuppressWarnings("deprecation") 通知java編譯器忽略特定的編譯警告
第三方注解
- spring:
@AutoWired
@Service
@Repository - Mybatis:
@InsertProvider
@UpdateProvider
@Options
3斟览、注解的分類
- 按照運(yùn)行機(jī)制分為
- 源碼注解:注解只在源碼中存在扫外,編譯成.class文件就不存在了
- 編譯時(shí)注解:注解在源碼和.class文件中都存在(如:JDK內(nèi)置系統(tǒng)注解(自帶的注解))
- 運(yùn)行時(shí)注解:在運(yùn)行階段還起作用,甚至?xí)绊戇\(yùn)行邏輯的注解(如:Spring中@Autowried)
- 按照來(lái)源分為
- JDK內(nèi)置系統(tǒng)注解
- 自定義注解
- 第三方注解
- 元注解 (注解的注解)
4嵌莉、自定義注解
自定義注解的語(yǔ)法要求
原始類型就是基本的數(shù)據(jù)類型进萄。
注解的注解(元注解)
框中的就是元注解。
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})
@Target 注解的作用域:
- CONSTRUCTOR 構(gòu)造方法聲明
- FIELD 字段聲明
- LOCAL_VARIABLE 局部變量聲明
- METHOD 方法聲明
- PACKAGE 包聲明
- PARAMETER 參數(shù)聲明
- TYPE 類接口锐峭。
@Retention(RetentionPolicy.RUNTIME)
@Retention 生命周期
- SOURCE 只在源碼顯示中鼠,編譯時(shí)會(huì)丟棄
- CLASS 編譯時(shí)會(huì)記錄到class中,運(yùn)行時(shí)忽略
- RUNTIME 運(yùn)行時(shí)存在沿癞,可以通過(guò)反射讀取援雇。
@Inherited
@Inherited 允許子類繼承
@Inherited(子類是否可繼承) 對(duì)接口interface、方法繼承沒(méi)有作用椎扬,對(duì)類才有效惫搏。也就是說(shuō),繼承只會(huì)繼承類上的注解蚕涤,而不會(huì)繼承方法上的注解
@Documented
生成javadoc的時(shí)候包含注解
使用自定義注解
解析注解
概念:通過(guò)反射獲取類筐赔、函數(shù)或成員上的運(yùn)行時(shí)注解信息,從而實(shí)現(xiàn)動(dòng)態(tài)控制程序運(yùn)行的邏輯揖铜。
public static void main(String[] args) {
// 1.使用類加載器加載類
try{
Class c= Class.forName("com.ann.test.Child");
// 2.找到類上面的注解
boolean isExit = c.isAnnotstionPresent(Desription.class);
//判斷類上是否有description這個(gè)注解
if(isExit){
//3.拿到注解實(shí)例
Description d = (Description)c.getAnnotation(Description.class);
System.out.println(d.value());
}
//4.找到方法上的注解
Method[] ms= c.getMethods();
for(Method m:ms){
boolean isMexist = m.isAnnotationPresent(Description.class);
if (isMexist) {
Description d = (Description)m.getAnnotation(Description.class);
System.out.print(d.value());
}
}
//另一種解析方法
for(Method m :ms){
Annotation[] as = m.getAnnotations();
for(Annotation a : as){
if (a instanceof Description) {
Description d = (Description)a;
System.out.println(d.value());
}
}
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
Ps1:RetentionPolicy.RUNTIME時(shí)茴丰,才能獲取到注解,SOURCE和CLASS都獲取不到注解蛮位。
Ps2:@Inherited對(duì)implements不起作用较沪,對(duì)extends起作用(只會(huì)繼承類上面注解,而不會(huì)繼承該類方法中的注解)失仁。
Ps3:instanceof概念:用來(lái)判斷內(nèi)存中實(shí)際對(duì)象A是不是B類型尸曼。