Java學(xué)習(xí)Day20—Junit單元測(cè)試、反射、注解

Junit單元測(cè)試:

  • 測(cè)試分類:
    1. 黑盒測(cè)試:不需要寫代碼,給輸入值,看程序是否能夠輸出期望的值。
    2. 白盒測(cè)試:需要寫代碼的。關(guān)注程序具體的執(zhí)行流程。

    • Junit使用:白盒測(cè)試
      • 步驟:

        1. 定義一個(gè)測(cè)試類(測(cè)試用例)

          • 建議:
            • 測(cè)試類名:被測(cè)試的類名+Test CalculatorTest
            • 包名:xxx.xxx.xx.test
        2. 定義測(cè)試方法:可以獨(dú)立運(yùn)行

          • 建議:
            • 方法名:test測(cè)試的方法名 testAdd()
            • 返回值:void
            • 參數(shù)列表:空參
        3. 給方法加@Test

        4. 導(dǎo)入junit依賴環(huán)境

      • 判定結(jié)果:

        • 紅色:失敗
        • 綠色:成功
        • 一般我們會(huì)使用斷言操作來處理結(jié)果
          • Assert.assertEquals(期望的結(jié)果,運(yùn)算的結(jié)果);
      • 補(bǔ)充:

        • @Before:
          • 修飾的方法會(huì)在測(cè)試方法之前被自動(dòng)執(zhí)行
        • @After:
          • 修飾的方法會(huì)在測(cè)試方法執(zhí)行之后自動(dòng)被執(zhí)行

反射:框架設(shè)計(jì)的靈魂

  • 框架:半成品軟件。可以在框架的基礎(chǔ)上進(jìn)行軟件開發(fā),簡(jiǎn)化編碼
    • 反射:將類的各個(gè)組成部分封裝為其他對(duì)象,這就是反射機(jī)制
      • 好處:
        1. 可以在程序運(yùn)行過程中,操作這些對(duì)象。
        2. 可以解耦,提高程序的可擴(kuò)展性。
  • 獲取Class對(duì)象的方式:
    1. Class.forName("全類名"):將字節(jié)碼文件加載進(jìn)內(nèi)存,返回Class對(duì)象
    * 多用于配置文件,將類名定義在配置文件中。讀取文件,加載類
    2. 類名.class:通過類名的屬性class獲取
    * 多用于參數(shù)的傳遞
    3. 對(duì)象.getClass():getClass()方法在Object類中定義著。
    * 多用于對(duì)象的獲取字節(jié)碼的方式

  • 結(jié)論:
    同一個(gè)字節(jié)碼文件(*.class)在一次程序運(yùn)行過程中,只會(huì)被加載一次,不論通過哪一種方式獲取的Class對(duì)象都是同一個(gè)。

  • Class對(duì)象功能:
    * 獲取功能:
  1. 獲取成員變量們
* Field[] getFields() :獲取所有public修飾的成員變量
* Field getField(String name)   獲取指定名稱的 public修飾的成員變量
* Field[] getDeclaredFields()  獲取所有的成員變量,不考慮修飾符
* Field getDeclaredField(String name)  
  • Field:成員變量
  • 操作:
    1. 設(shè)置值
      * void set(Object obj, Object value)

    2. 獲取值
      * get(Object obj)

    3. 忽略訪問權(quán)限修飾符的安全檢查
      * setAccessible(true):暴力反射

  1. 獲取構(gòu)造方法們
* Constructor<?>[] getConstructors()  
* Constructor<T> getConstructor(類<?>... parameterTypes)  
* Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)  
* Constructor<?>[] getDeclaredConstructors()  
  • Constructor:構(gòu)造方法
    * 創(chuàng)建對(duì)象:
    * T newInstance(Object... initargs)

    • 如果使用空參數(shù)構(gòu)造方法創(chuàng)建對(duì)象,操作可以簡(jiǎn)化:Class對(duì)象的newInstance方法

3.獲取成員方法們

* Method[] getMethods()  
* Method getMethod(String name, 類<?>... parameterTypes)  
* Method[] getDeclaredMethods()  
* Method getDeclaredMethod(String name, 類<?>... parameterTypes)  
  • Method:方法對(duì)象
    * 執(zhí)行方法:
    * Object invoke(Object obj, Object... args)
  1. 獲取全類名
  • String getName()
  • 獲取方法名稱:
    * String getName:獲取方法名

  • 案例:
    * 需求:寫一個(gè)"框架",不能改變?cè)擃惖娜魏未a的前提下,可以幫我們創(chuàng)建任意類的對(duì)象,并且執(zhí)行其中任意方法
    * 實(shí)現(xiàn):
    1. 配置文件
    2. 反射
    * 步驟:
    1. 將需要?jiǎng)?chuàng)建的對(duì)象的全類名和需要執(zhí)行的方法定義在配置文件中
    2. 在程序中加載讀取配置文件
    3. 使用反射技術(shù)來加載類文件進(jìn)內(nèi)存
    4. 創(chuàng)建對(duì)象
    5. 執(zhí)行方法
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();//創(chuàng)建properties對(duì)象
        ClassLoader classLoader = demo01.class.getClassLoader();//加載配置文件,獲取class目錄下的配置文件
        InputStream is = classLoader.getResourceAsStream("test.properties");
        properties.load(is);
        //獲取配置文件中的數(shù)據(jù)
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");
        //加載該類進(jìn)內(nèi)存
        Class cls = Class.forName(className);
        Object obj = cls.newInstance();//創(chuàng)建對(duì)象
        Method method = cls.getMethod(methodName);//獲取方法
        method.invoke(obj);
    }
    

注解:

注解(Annotation),也叫元數(shù)據(jù)。一種代碼級(jí)別的說明。它是JDK1.5及以后版本引入的一個(gè)特性,與類、接口、枚舉是在同一個(gè)層次。它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對(duì)這些元素進(jìn)行說明,注釋。
* 概念描述:
* JDK1.5之后的新特性
* 說明程序的
* 使用注解:@注解名稱

  • 作用分類:
    ①編寫文檔:通過代碼里標(biāo)識(shí)的注解生成文檔【生成文檔doc文檔】
    ②代碼分析:通過代碼里標(biāo)識(shí)的注解對(duì)代碼進(jìn)行分析【使用反射】
    ③編譯檢查:通過代碼里標(biāo)識(shí)的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】
  • JDK中預(yù)定義的一些注解
    * @Override :檢測(cè)被該注解標(biāo)注的方法是否是繼承自父類(接口)的
    * @Deprecated:該注解標(biāo)注的內(nèi)容,表示已過時(shí)
    * @SuppressWarnings:壓制警告
    * 一般傳遞參數(shù)all @SuppressWarnings("all")

    • 自定義注解

      • 格式:
        元注解
        public @interface 注解名稱{
        屬性列表;
        }

      • 本質(zhì):注解本質(zhì)上就是一個(gè)接口,該接口默認(rèn)繼承Annotation接口

        • public interface MyAnno extends java.lang.annotation.Annotation {}
      • 屬性:接口中的抽象方法

        • 要求:
          1. 屬性的返回值類型有下列取值

            • 基本數(shù)據(jù)類型
            • String
            • 枚舉
            • 注解
            • 以上類型的數(shù)組
          2. 定義了屬性,在使用時(shí)需要給屬性賦值

            1. 如果定義屬性時(shí),使用default關(guān)鍵字給屬性默認(rèn)初始化值,則使用注解時(shí),可以不進(jìn)行屬性的賦值。
            2. 如果只有一個(gè)屬性需要賦值,并且屬性的名稱是value,則value可以省略,直接定義值即可。
            3. 數(shù)組賦值時(shí),值使用{}包裹。如果數(shù)組中只有一個(gè)值,則{}可以省略
      • 元注解:用于描述注解的注解

        • @Target:描述注解能夠作用的位置
          • ElementType取值:
            • TYPE:可以作用于類上
            • METHOD:可以作用于方法上
            • FIELD:可以作用于成員變量上
        • @Retention:描述注解被保留的階段
          • @Retention(RetentionPolicy.RUNTIME):當(dāng)前被描述的注解,會(huì)保留到class字節(jié)碼文件中,并被JVM讀取到
        • @Documented:描述注解是否被抽取到api文檔中
        • @Inherited:描述注解是否被子類繼承
  • 在程序使用(解析)注解:獲取注解中定義的屬性值
    1. 獲取注解定義的位置的對(duì)象 (Class,Method,Field)
    2. 獲取指定的注解
    * getAnnotation(Class)
    //其實(shí)就是在內(nèi)存中生成了一個(gè)該注解接口的子類實(shí)現(xiàn)對(duì)象

                  public class ProImpl implements Pro{
                      public String className(){
                          return "cn.itcast.annotation.Demo1";
                      }
                      public String methodName(){
                          return "show";
                      }
                  }
      3. 調(diào)用注解中的抽象方法獲取配置的屬性值
    
    • 小結(jié):
      1. 以后大多數(shù)時(shí)候,我們會(huì)使用注解,而不是自定義注解
      2. 注解給誰(shuí)用?
        1. 編譯器
        2. 給解析程序用
      3. 注解不是程序的一部分,可以理解為注解就是一個(gè)標(biāo)簽
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,236評(píng)論 0 4
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,653評(píng)論 1 32
  • 一、Junit單元測(cè)試 測(cè)試分類:1、黑盒測(cè)試:不需要寫代碼,給輸入值,看程序是否能夠輸出期望值。2、白盒測(cè)試:需...
    pure_joy閱讀 163評(píng)論 0 0
  • 課程地址:Java基礎(chǔ)之 — 反射(非常重要) (使用的前提條件:必須先得到代表的字節(jié)碼的Class,Cla...
    叨唧唧的閱讀 759評(píng)論 0 2
  • 一眨眼,自己已經(jīng)28歲了。望著鏡子中蒼白的臉,我展眉一笑,無論前路如何,一定要堅(jiān)持! 臉書的創(chuàng)始人扎克伯格每年給自...
    新新_2451閱讀 189評(píng)論 1 1

友情鏈接更多精彩內(nèi)容