Junit單元測(cè)試:
-
測(cè)試分類:
1. 黑盒測(cè)試:不需要寫代碼,給輸入值需曾,看程序是否能夠輸出期望的值吗坚。
2. 白盒測(cè)試:需要寫代碼的。關(guān)注程序具體的執(zhí)行流程胯舷。- Junit使用:白盒測(cè)試
-
步驟:
-
定義一個(gè)測(cè)試類(測(cè)試用例)
- 建議:
- 測(cè)試類名:被測(cè)試的類名+Test CalculatorTest
- 包名:xxx.xxx.xx.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:
-
- Junit使用:白盒測(cè)試
反射:框架設(shè)計(jì)的靈魂
- 框架:半成品軟件刻蚯。可以在框架的基礎(chǔ)上進(jìn)行軟件開發(fā)桑嘶,簡(jiǎn)化編碼
- 反射:將類的各個(gè)組成部分封裝為其他對(duì)象炊汹,這就是反射機(jī)制
- 好處:
- 可以在程序運(yùn)行過程中,操作這些對(duì)象逃顶。
- 可以解耦讨便,提高程序的可擴(kuò)展性。
- 好處:
- 反射:將類的各個(gè)組成部分封裝為其他對(duì)象炊汹,這就是反射機(jī)制
獲取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ì)象功能:
* 獲取功能:
- 獲取成員變量們
* Field[] getFields() :獲取所有public修飾的成員變量
* Field getField(String name) 獲取指定名稱的 public修飾的成員變量
* Field[] getDeclaredFields() 獲取所有的成員變量衰倦,不考慮修飾符
* Field getDeclaredField(String name)
- Field:成員變量
- 操作:
設(shè)置值
* void set(Object obj, Object value)獲取值
* get(Object obj)忽略訪問權(quán)限修飾符的安全檢查
* setAccessible(true):暴力反射
- 獲取構(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)
- 獲取全類名
- 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 {}
-
屬性:接口中的抽象方法
- 要求:
-
屬性的返回值類型有下列取值
- 基本數(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:描述注解能夠作用的位置
-
-
在程序使用(解析)注解:獲取注解中定義的屬性值
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é):
- 以后大多數(shù)時(shí)候,我們會(huì)使用注解障簿,而不是自定義注解
- 注解給誰用霹抛?
- 編譯器
- 給解析程序用
- 注解不是程序的一部分,可以理解為注解就是一個(gè)標(biāo)簽
- 小結(jié):