1.什麼是註解?
1. jdk1.5之後出現的,不是註釋。
2. 註釋是程序員寫的,程序員看註釋幫助理解程序代碼。 註解是給程序看的。描述程序如何運行的以及在什麼階段運行的。(源代碼階段,編譯階段,運行階段)
3. 註解相當於一種標記,看見一個註解就知道要做什麼事。在程序中使用反射來解釋註解是幹什麼的。
4. 註解可以添加類,包,變量,方法等等上 (@Test給方法添加註解)
2.註解的作用?
2.1 編寫文檔。
2.2 代碼分析(使用反射來解釋註解)
2.3 編譯檢查(@Override)進行基本的編譯檢查。
3.常見的註解?
3.1 @Override 重寫(父類與子類之間的關係) 額外:@Overload重載(體現的多態性)
3.2 @Deprecated 類或者方法已經過時
3.3 @SupperWarings 排除相關警告
4.註解的聲明
聲明的註解格式: 註解的關鍵字 @interface
@Retention
@Target
訪問權限 @interface 註解名{
可以聲明的類型有 基本類型,String,枚舉類型,Class類型,
示例: public String name();
}
查看註解的本質: 首先反編譯class文件 ,執行命令javap -c class文件
結果:
Compiled from "MyAnnotation.java"
public interface com.sky.anntotation.MyAnnotation extends java.lang.annotation.Annotation {
}
本質是一個接口,父類是Annotation.
備註:一個註解必須聲明在什麼階段可用,以及可以用在什麼地方。
5.註解的相關方法
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 判斷指定filed或者method或者類等等。。。上是否有指定的註解
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) 獲取指定filed或者method或者類等上的指定註解
public Annotation[] getAnnotations() :獲取指定filed或者method或者類等上的所有註解
6.註解的分類(4個)
5.1@Retention該註解可以運行在那個階段(值:SOURCE,CLASS,RUNTIME)
5.1.1 SOURCE:表示註解只在源代碼階段有用,在編譯階段之後直接拋棄。
5.1.2 CLASS:註解在class中可以用,但是在vm中被拋棄。
5.1.3 RUNTIME:在VM運行階段保留註解。因此通過反射讀取註解的信息。
5.2@Target表示該註解可以用在什麼地方(構造方法,局部變量,方法,包,參數等等。。。。)
5.3 @Documented 將註解包含到doc中
執行命令(切換目錄到指定類的位置): javadoc -d doc 類名.java (該類中使用了註解)
5.4 @Inerited 允許子類可以繼承父類的註解
7.反射和註解的關係?
解釋: 如果註解要具有一定意義的功能,必須使用反射來解析,給指定註解注入不同的功能。
1. 如果某一個註解具有賦值功能,肯定是反射獲取到指定變量,調用了f.set(obj,value)去賦值。
2. 如果是某個方法具有一定功能,肯定是反射獲取到指定方法,調用method.invoke(obj,obj)進行方法調用
1和2做法基本都是框架完成,已經封裝好,所以咱們第三階段使用註解直接用了
例如: @transactionManager 數據庫框架階段直接使用註解就完成了事務處理。
大公司框架都是自己封裝的。小公司直接用大公司發佈的開源的,複製粘帖。
7.tomcat中servlet,filter,listener三個使用註解如何完成?
servlet規範中2.5之前使用web.xml進行註冊
servlet3.0之後直接使用註解自動註冊,不需要web.xml
Serlvet註解註冊:
方式一:@WebServlet("/aa") servlet一個映射地址
方式二:@WebServlet(name="ServletDemo01",urlPatterns={"/cc","/bb"}) servlet多個映射地址
Listener註解註冊:@WebListener
Filter註解註冊:@WebFilter("/*")
使用註解註冊:
優點:開發效率高(代碼少)
缺點:硬編碼(修改困難)
使用web.xml註冊:
優點:可配置,解耦合
缺點:不直觀,效率低