day01【基礎加強】_Junit單元測試、反射、註解

今日內容

  1. Junit單元測試
  2. 反射
  3. 註解

1 Junit單元測試:

1.1測試分類

  • 黑盒測試:不需要寫代碼,給輸入值,看程序是否能夠輸出期望的值
  • 白盒測試:需要寫代碼。關注程序具體的執行流程

1.2Junit使用:白盒測試

  • 步驟:
  1. 定義一個測試類(測試用例)
    建議:
    測試類名:被測試的類名Test CalculatorTest
    包名:xxx.xxx.xx.test cn.itcast.test
  2. 定義測試方法:可以獨立運行
    建議:
    方法名:test測試的方法名 testAdd()
    返回值:void
    參數列表:空參
  3. 給方法加@Test
  4. 導入Junit依賴環境
  • 判定結果:
    紅色:失敗
    綠色:成功
    使用斷言操作來處理結果
    Assert.assertEquals(期望的結果,運算的結果);
  • 補充:
    @Before
    修飾的方法會在測試方法之前被自動執行
    @After
    修飾的方法會在測試方法執行之後自動執行

2 反射:框架設計的靈魂

  • 框架:半成品軟件。可以在框架的基礎上進行軟件開發,簡化編碼
  • 反射:將類的各個組成部分封裝爲其他對象,這就是反射機制
  • 好處:
    1. 可以在程序運行過程中,操作這些對象。
    2. 可以解耦,提高程序的可擴展性。

2.1 獲取Class對象的方式:

  1. Class.forName(“全類名”):將字節碼文件加載進內存,返回Class對象
    多用於配置文件(增加代碼的擴展性,在不改變源碼的情況下,修改配置文件中的全類名,可以使得在程序運行過程中產生不同的效果)
  2. 類名.class:通過類名的屬性class獲取
    用於當成實際參數傳遞
  3. 對象.getClass():getClass()方法在Object類中定義着。
    用於給這個對象的所有成員變量賦值(我們不在不要一個一個調用set方法)

獲得類對象是使用反射的前提
結論:
同一個字節碼文件(*.class)在一次程序運行過程中,只會被加載一次,不論通過哪一種方式獲取的Class對象都是同一個。

2.2 Class對象功能:

  • 獲取功能
  1. 獲取成員變量們
    Field[] getFields() :獲取所有public修飾的成員變量
    Field getField(String name) 獲取指定名稱的 public修飾的成員變量
    Field[] getDeclaredFields() 獲取所有的成員變量,不考慮修飾符
    Field getDeclaredField(String name)
  2. 獲取構造方法們
    Constructor<?>[] getConstructors()
    Constructor getConstructor(類<?>… parameterTypes)
    Constructor getDeclaredConstructor(類<?>… parameterTypes)
    Constructor<?>[] getDeclaredConstructors()
  3. 獲取成員方法們:
    Method[] getMethods()
    Method getMethod(String name, 類<?>…parameterTypes)
    Method[] getDeclaredMethods()
    Method getDeclaredMethod(String name, 類<?>… parameterTypes)
  4. 獲取全類名
    String getName()
  • Field:成員變量
    操作:
    1. 設置值
    void set(Object obj, Object value)
    2. 獲取值
    get(Object obj) get(Object obj)
    3. 忽略訪問權限修飾符的安全檢
    setAccessible(true):暴力反射
  • Constructor:構造方法
    創建對象:
    T newInstance(Object… initargs)
    如果使用空參數構造方法創建對象,操作可以簡化:
    Class對象的newInstance方法
  • Method:方法對象
    執行方法:
    Object invoke(Object obj, Object… args)
    獲取方法名稱:
    String getName:獲取方法名

3 註解:

3.1 概念

  • 概念:說明程序的。給計算機看的
  • 註釋:用文字描述程序的。給程序員看的
  • 定義:註解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,註釋。
  • 概念描述:
    * JDK1.5之後的新特性
    * 說明程序的
    * 使用註解:@註解名稱

3.2 作用分類

①編寫文檔:通過代碼裏標識的註解生成文檔【生成文檔doc文檔】
②代碼分析:通過代碼裏標識的註解對代碼進行分析【使用反射】
③編譯檢查:通過代碼裏標識的註解讓編譯器能夠實現基本的編譯檢查【Override】

3.3 JDK中預定義的一些註解

  • @Override :檢測被該註解標註的方法是否是繼承自父類(接口)的
  • @Deprecated:該註解標註的內容,表示已過時
  • @SuppressWarnings:壓制警告
    * 一般傳遞參數all @SuppressWarnings(“all”)

3.4 自定義註解

  • 格式:
    元註解
    public @interface 註解名稱{
    屬性列表;
    }
  • 本質:註解本質上就是一個接口,該接口默認繼承Annotation接口
    * public interface MyAnno extends java.lang.annotation.Annotation {}
  • 屬性:接口中的抽象方法
    * 要求:
    1. 屬性的返回值類型有下列取值
    * 基本數據類型
    * String
    * 枚舉
    * 註解
    * 以上類型的數組
    2. 定義了屬性,在使用時需要給屬性賦值
    1. 如果定義屬性時,使用default關鍵字給屬性默認初始化值,則使用註解時,可以不進行屬性的賦值。
    2. 如果只有一個屬性需要賦值,並且屬性的名稱是value,則value可以省略,直接定義值即可。
    3. 數組賦值時,值使用{}包裹。如果數組中只有一個值,則{}可以省略
  • 元註解:用於描述註解的註解
    * @Target:描述註解能夠作用的位置
    * @Inherited:描述註解是否被子類繼承
    * ElementType取值:
  • TYPE:可以作用於類上
  • METHOD:可以作用於方法上
  • FIELD:可以作用於成員變量上
  • @Retention:描述註解被保留的階段
  • @Retention(RetentionPolicy.RUNTIME):當前被描述的註解,會保留到class字節碼文件中,並被JVM讀取到
  • @Documented:描述註解是否被抽取到api文檔中

3.5 在程序使用(解析)註解:獲取註解中定義的屬性值

  1. 獲取註解定義的位置的對象 (Class,Method,Field)
  2. 獲取指定的註解
    * getAnnotation(Class)
    //其實就是在內存中生成了一個該註解接口的子類實現對象
public class ProImpl implements Pro{
	   public String className(){
	     return "cn.itcast.annotation.Demo1";
	   }
	   public String methodName(){
	      return "show";
	   }
}
  1. 調用註解中的抽象方法獲取配置的屬性值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章