天天看點

java基礎加強Junit單元測試、反射、注解

文章目錄

  • Junit單元測試、反射、注解
    • 1.Junit單元測試:
    • 2.反射:架構設計的靈魂
    • 3.注解:
    • 靜态代碼塊

Junit單元測試、反射、注解

1.Junit單元測試:

  • 測試分類:

    1.黑盒測試:不需要寫代碼,給輸入值,看程式是否能夠輸出期望的值。

    2.白盒測試:需要寫代碼的。關注程式具體的執行流程。

  • Junit使用:白盒測試

    *步驟:

    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.可以解耦,捉高程式的可擴充性。

  • 擷取C1ass對象的方式:I

    1.Class.forName(“全類名”):捋位元組碼檔案加載進記憶體,傳回class對象

    * 多用于配檔案,将類名定義在配檔案中。讀取檔案,加載類

    2.類名.class:通過類名的s性class擷取

    * 多用于參數的傳遞

    3.對象.getclass():getclass()方法在object類中定義着。

    * 多用于對象的擷取位元組碼的方式

    • 結論:

      同一個位元組碼檔案(*.class)在一次程式運作過程中,隻會被加載一次,

      不論通過哪一種方式擷取的Class對象都是同一個。

  • 反射執行個體代碼:
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //可以建立任意類的對象,可以執行任意方法

        /*
            前提:不能改變該類的任何代碼。可以建立任意類的對象,可以執行任意方法
         */
      /*  Person p = new Person();
        p.eat();*/
/*
        Student stu = new Student();
        stu.sleep();*/

        //1.加載配置檔案
        //1.1建立Properties對象
        Properties pro = new Properties();
        //1.2加載配置檔案,轉換為一個集合
        //1.2.1擷取class目錄下的配置檔案
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        pro.load(is);

        //2.擷取配置檔案中定義的資料
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");


        //3.加載該類進記憶體
        Class cls = Class.forName(className);
        //4.建立對象
        Object obj = cls.newInstance();
        //5.擷取方法對象
        Method method = cls.getMethod(methodName);
        //6.執行方法
        method.invoke(obj);


    }
}
           

3.注解:

  • 概念:說明程式的。給計算機看的

    注釋:用文字描述程式的。給程式員看的

  • 定義:注解(Annotation),也叫中繼資料。一種代碼級别的說明。它是JDK1.5及以後版本引人的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。

    *概念描述:

    • JDK1.5之後的新特性
    • 說明程式的
    • 使用注解:@注解名稱
  • 作用分類:

    ①編寫文檔:通過代碼裡辨別的注解生成文檔【生成文檔doc文檔】

    ②代碼分析:通過代碼裡辨別的注解對代碼進行分析【使用反射】

    ③編譯檢查:通過代碼裡辨別的注解讓編譯器能夠實作基本的編譯檢查【override】

  • jDK中預定義的一些注解
    • @Override:檢測被該注解标注的方法是否是繼承自父類(接口)的
    • @Deprecated:該注解标注的内容,表示已過時
    • @Suppresswarnings:壓制警告
  • 自定義注解
    • 格式:元注解

      [email protected]注解名稱}

    • 本質:注解本質上就是一個接口,該接口預設繼承Annotation接口
      • public interface MyAnno extends java.lang.annotation.Annotation{}
    • 屬性:接口中的抽象方法
      • 要求:

        1.屬性的傳回值類型有下列取值

        * 基本資料類型

        * String

        * 枚舉*注解

        *以上類型的數組

        2.定義了屬性,在使用時需要給屬性指派

        1.如果定義屬性時,使用default關鍵字給屬性預設初始化值,則使用注解時,可以不進行屬性的指派。

        2.如果隻有一個屬性需要指派,并且屬性的名稱是value,則value可以省略,直接定義值即可

        3.數組指派時,值使用{}包裹。如果數組中隻有一個值,則{}可以省略

    • 元注解:用于描述注解的注解

      *@Target:描述注解能夠作用的位置

      *ElementType取值:

      *TYPE:可以作用于類上

      *METHOD:可以作用于方法上

      *FIELD:可以作用于成員變量上

      *@Retention:描述注解被保留的階段

      *@Retention(RetentionPolicy.RUNTIMED:目前被描述的注解,會保留到class位元組碼檔案中,并被]VM讀取到

      *@Documented:描述注解是否被抽取到api文檔中

      *@Inherited:描述注解是否被子類繼承

靜态代碼塊

  • java類中使用static關鍵字修飾類中的代碼塊
靜态子產品在類加載時執行并且隻執行一次,他可以完成類變量的初始化,靜态初始化代碼塊執行是在main方法執行前完成的。