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. 注解給誰用霹抛?
        1. 編譯器
        2. 給解析程序用
      3. 注解不是程序的一部分,可以理解為注解就是一個(gè)標(biāo)簽
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卷谈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霞篡,更是在濱河造成了極大的恐慌世蔗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朗兵,死亡現(xiàn)場(chǎng)離奇詭異污淋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)余掖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門寸爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盐欺,你說我怎么就攤上這事赁豆。” “怎么了冗美?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵魔种,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我粉洼,道長(zhǎng)节预,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任属韧,我火速辦了婚禮安拟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宵喂。我一直安慰自己糠赦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布锅棕。 她就那樣靜靜地躺著愉棱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哲戚。 梳的紋絲不亂的頭發(fā)上奔滑,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音顺少,去河邊找鬼朋其。 笑死王浴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梅猿。 我是一名探鬼主播氓辣,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼袱蚓!你這毒婦竟也來了钞啸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤喇潘,失蹤者是張志新(化名)和其女友劉穎体斩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颖低,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡絮吵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忱屑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬敲。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖莺戒,靈堂內(nèi)的尸體忽然破棺而出伴嗡,到底是詐尸還是另有隱情,我是刑警寧澤从铲,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布闹究,位于F島的核電站,受9級(jí)特大地震影響食店,放射性物質(zhì)發(fā)生泄漏渣淤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一吉嫩、第九天 我趴在偏房一處隱蔽的房頂上張望价认。 院中可真熱鬧,春花似錦自娩、人聲如沸用踩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脐彩。三九已至,卻和暖如春姊扔,著一層夾襖步出監(jiān)牢的瞬間惠奸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工恰梢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佛南,地道東北人梗掰。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嗅回,于是被迫代替她去往敵國(guó)和親及穗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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