Junit、反射、注解

內(nèi)容預(yù)覽

  1. Junit單元測(cè)試
  2. 反射
  3. 注解

Junit單元測(cè)試:

  • 測(cè)試分類:
    1. 黑盒測(cè)試:不需要寫代碼妓柜,給輸入值,看程序是否能夠輸出期望的值藏雏。
    2. 白盒測(cè)試:需要寫代碼的。關(guān)注程序具體的執(zhí)行流程掘殴。
黑盒和白盒.png
  • Junit使用:白盒測(cè)試
    • 步驟:

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

        • 建議:
          • 測(cè)試類名:被測(cè)試的類名Test CalculatorTest
          • 包名:xxx.xxx.xx.test cn.shenli.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ì)的靈魂

Java代碼的三個(gè)階段.png
  • 框架:半成品軟件奏寨。可以在框架的基礎(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)

      2. 獲取構(gòu)造方法們

        • Constructor<?>[] getConstructors()

        • Constructor<T> getConstructor(類<?>... parameterTypes)

        • Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)

        • Constructor<?>[] getDeclaredConstructors()

      3. 獲取成員方法們:

        • Method[] getMethods()

        • Method getMethod(String name, 類<?>... parameterTypes)

        • Method[] getDeclaredMethods()

        • Method getDeclaredMethod(String name, 類<?>... parameterTypes)

      4. 獲取全類名

        • String getName()
  • Field:成員變量
    • 操作:
      1. 設(shè)置值

        • void set(Object obj, Object value)
      2. 獲取值

        • get(Object obj)
      3. 忽略訪問權(quán)限修飾符的安全檢查

        • setAccessible(true):暴力反射
  • Constructor:構(gòu)造方法
    • 創(chuàng)建對(duì)象:
      • T newInstance(Object... initargs)

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

  • Method:方法對(duì)象
    • 執(zhí)行方法:

      • Object invoke(Object obj, Object... args)
    • 獲取方法名稱:

      • 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í)行方法

注解:

  • 概念:說明程序的困后。給計(jì)算機(jī)看的

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

  • 定義:注解(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ǎn)單的測(cè)試框架
  • 小結(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閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烛恤,死亡現(xiàn)場(chǎng)離奇詭異母怜,居然都是意外死亡缚柏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門轨域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人干发,你說我怎么就攤上這事⊥鞒ぃ” “怎么了琼讽?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吼蚁。 經(jīng)常有香客問我问欠,道長(zhǎng),這世上最難降的妖魔是什么术唬? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任粗仓,我火速辦了婚禮设捐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚂斤。我一直安慰自己槐沼,他們只是感情好捌治,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布肖油。 她就那樣靜靜地躺著臂港,像睡著了一般。 火紅的嫁衣襯著肌膚如雪县袱。 梳的紋絲不亂的頭發(fā)上佑力,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天搓萧,我揣著相機(jī)與錄音,去河邊找鬼揍移。 笑死反肋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罕邀。 我是一名探鬼主播养距,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼棍厌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了敬肚?” 一聲冷哼從身側(cè)響起束析,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤员寇,失蹤者是張志新(化名)和其女友劉穎第美,沒想到半個(gè)月后曹动,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓陈,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贡必,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年庸毫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飒赃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炒事,死狀恐怖蔫慧,靈堂內(nèi)的尸體忽然破棺而出姑躲,到底是詐尸還是另有隱情,我是刑警寧澤卖怜,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布阐枣,位于F島的核電站,受9級(jí)特大地震影響虑粥,放射性物質(zhì)發(fā)生泄漏宪哩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一彬祖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甜熔,春花似錦突倍、人聲如沸腔稀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诵闭。三九已至澎嚣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間易桃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工踩衩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驱富。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓匹舞,卻偏偏與公主長(zhǎng)得像褐鸥,于是被迫代替她去往敵國和親赐稽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361