內(nèi)容預(yù)覽
- Junit單元測(cè)試
- 反射
- 注解
Junit單元測(cè)試:
- 測(cè)試分類:
- 黑盒測(cè)試:不需要寫代碼妓柜,給輸入值,看程序是否能夠輸出期望的值藏雏。
- 白盒測(cè)試:需要寫代碼的。關(guān)注程序具體的執(zhí)行流程掘殴。
- Junit使用:白盒測(cè)試
-
步驟:
-
定義一個(gè)測(cè)試類(測(cè)試用例)
- 建議:
- 測(cè)試類名:被測(cè)試的類名Test CalculatorTest
- 包名:xxx.xxx.xx.test cn.shenli.test
- 建議:
-
定義測(cè)試方法:可以獨(dú)立運(yùn)行
- 建議:
- 方法名:test測(cè)試的方法名 testAdd()
- 返回值:void
- 參數(shù)列表:空參
- 建議:
給方法加@Test
導(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í)行
- @Before:
-
反射:框架設(shè)計(jì)的靈魂
- 框架:半成品軟件奏寨。可以在框架的基礎(chǔ)上進(jìn)行軟件開發(fā)病瞳,簡(jiǎn)化編碼
- 反射:將類的各個(gè)組成部分封裝為其他對(duì)象悲酷,這就是反射機(jī)制
- 好處:
- 可以在程序運(yùn)行過程中,操作這些對(duì)象设易。
- 可以解耦,提高程序的可擴(kuò)展性顿肺。
- 好處:
-
獲取Class對(duì)象的方式:
- Class.forName("全類名"):將字節(jié)碼文件加載進(jìn)內(nèi)存,返回Class對(duì)象
- 多用于配置文件屠尊,將類名定義在配置文件中。讀取文件肋僧,加載類
- 類名.class:通過類名的屬性class獲取
- 多用于參數(shù)的傳遞
- 對(duì)象.getClass():getClass()方法在Object類中定義著控淡。
- 多用于對(duì)象的獲取字節(jié)碼的方式
- 結(jié)論:
同一個(gè)字節(jié)碼文件(*.class)在一次程序運(yùn)行過程中,只會(huì)被加載一次掺炭,不論通過哪一種方式獲取的Class對(duì)象都是同一個(gè)凭戴。
- Class.forName("全類名"):將字節(jié)碼文件加載進(jìn)內(nèi)存,返回Class對(duì)象
- Class對(duì)象功能:
- 獲取功能:
-
獲取成員變量們
Field[] getFields() :獲取所有public修飾的成員變量
Field getField(String name) 獲取指定名稱的 public修飾的成員變量
Field[] getDeclaredFields() 獲取所有的成員變量,不考慮修飾符
Field getDeclaredField(String name)
-
獲取構(gòu)造方法們
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(類<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
-
獲取成員方法們:
Method[] getMethods()
Method getMethod(String name, 類<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 類<?>... parameterTypes)
-
獲取全類名
- String getName()
-
- 獲取功能:
- Field:成員變量
- 操作:
-
設(shè)置值
- void set(Object obj, Object value)
-
獲取值
- get(Object obj)
-
忽略訪問權(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方法
- 創(chuàng)建對(duì)象:
- Method:方法對(duì)象
-
執(zhí)行方法:
- Object invoke(Object obj, Object... args)
-
獲取方法名稱:
- String getName:獲取方法名
-
- 案例:
- 需求:寫一個(gè)"框架"肤视,不能改變?cè)擃惖娜魏未a的前提下涉枫,可以幫我們創(chuàng)建任意類的對(duì)象,并且執(zhí)行其中任意方法
- 實(shí)現(xiàn):
- 配置文件
- 反射
- 步驟:
- 將需要?jiǎng)?chuàng)建的對(duì)象的全類名和需要執(zhí)行的方法定義在配置文件中
- 在程序中加載讀取配置文件
- 使用反射技術(shù)來加載類文件進(jìn)內(nèi)存
- 創(chuàng)建對(duì)象
- 執(zhí)行方法
- 實(shí)現(xiàn):
- 需求:寫一個(gè)"框架"肤视,不能改變?cè)擃惖娜魏未a的前提下涉枫,可以幫我們創(chuàng)建任意類的對(duì)象,并且執(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 {}
-
屬性:接口中的抽象方法
- 要求:
-
屬性的返回值類型有下列取值
- 基本數(shù)據(jù)類型
- String
- 枚舉
- 注解
- 以上類型的數(shù)組
-
定義了屬性消别,在使用時(shí)需要給屬性賦值
- 如果定義屬性時(shí)台谢,使用default關(guān)鍵字給屬性默認(rèn)初始化值,則使用注解時(shí)朋沮,可以不進(jìn)行屬性的賦值。
- 如果只有一個(gè)屬性需要賦值朽们,并且屬性的名稱是value,則value可以省略骑脱,直接定義值即可。
- 數(shù)組賦值時(shí)啤誊,值使用{}包裹。如果數(shù)組中只有一個(gè)值蚊锹,則{}可以省略
-
- 要求:
-
元注解:用于描述注解的注解
- @Target:描述注解能夠作用的位置
- ElementType取值:
- TYPE:可以作用于類上
- METHOD:可以作用于方法上
- FIELD:可以作用于成員變量上
- ElementType取值:
- @Retention:描述注解被保留的階段
- @Retention(RetentionPolicy.RUNTIME):當(dāng)前被描述的注解稚瘾,會(huì)保留到class字節(jié)碼文件中牡昆,并被JVM讀取到
- @Documented:描述注解是否被抽取到api文檔中
- @Inherited:描述注解是否被子類繼承
- @Target:描述注解能夠作用的位置
- 在程序使用(解析)注解:獲取注解中定義的屬性值
獲取注解定義的位置的對(duì)象 (Class摊欠,Method,Field)
-
獲取指定的注解
- 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"; } }
- getAnnotation(Class)
調(diào)用注解中的抽象方法獲取配置的屬性值
- 案例:簡(jiǎn)單的測(cè)試框架
- 小結(jié):
- 以后大多數(shù)時(shí)候,我們會(huì)使用注解播瞳,而不是自定義注解
- 注解給誰用免糕?
- 編譯器
- 給解析程序用
- 注解不是程序的一部分赢乓,可以理解為注解就是一個(gè)標(biāo)簽