一斥季、Junit單元測試
導(dǎo)入Junit依賴后,可以自定義測試類午笛,在方法前加上:
@Test
那么可以單獨執(zhí)行這個方法李丰。
斷言:Assert.assertEquals(期望的結(jié)果,運算的結(jié)果);
常常使用斷言來判斷是否與期望的結(jié)果一致
@Before:
修飾的方法會在測試方法之前被自動執(zhí)行
@After:
修飾的方法會在測試方法執(zhí)行之后自動被執(zhí)行
二苦锨、反射
將類的各個部分,封裝成一個個的對象趴泌,就是反射
類對象未被new創(chuàng)建前舟舒,會被Class類保存在內(nèi)存中。
Java文件的三個階段:source階段嗜憔,class階段秃励,runtime階段
- 獲取Class對象的方式:
1. Class.forName("全類名"):將字節(jié)碼文件加載進內(nèi)存,返回Class對象
多用于配置文件吉捶,將類名定義在配置文件中夺鲜。讀取文件,加載類
2. 類名.class:通過類名的屬性class獲取
多用于參數(shù)的傳遞
3. 對象.getClass():getClass()方法在Object類中定義著呐舔。
多用于對象的獲取字節(jié)碼的方式
三食呻、反射訪問非public的部分
Field類、Constructor類澎现、Method類都有setAccessible(true)方法,可以讓忽略訪問權(quán)限的檢查仅胞,這樣就能訪問非public的部分了
Class類中的方法可以來獲取Field類、Constructor類昔头、Method類的對象
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類可以來設(shè)置成員變量
1. 設(shè)置值
void set(Object obj, Object value)
2. 獲取值
get(Object obj)
3. 忽略訪問權(quán)限修飾符的安全檢查
setAccessible(true):暴力反射
Constructor類可以來新建對象
Constructor:構(gòu)造方法
創(chuàng)建對象:
T newInstance(Object... initargs)
如果使用空參數(shù)構(gòu)造方法創(chuàng)建對象,操作可以簡化:Class對象的newInstance方法
Method類可以來執(zhí)行方法
執(zhí)行方法:
Object invoke(Object obj, Object... args)
獲取方法名稱:
String getName:獲取方法名
使用反射的好處揭斧,可以僅僅修改配置文件執(zhí)行不同類中的不同方法,而不用修改類文件峻堰。
四讹开、注解
比如像是@Override就是一個注解
注解的作用:
①編寫文檔:通過代碼里標(biāo)識的注解生成文檔(Javadoc)
【生成文檔doc文檔】
②代碼分析:通過代碼里標(biāo)識的注解對代碼進行分析
【使用反射】
③編譯檢查:通過代碼里標(biāo)識的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】
JDK內(nèi)置的注解:
@Deprecated
可以標(biāo)記方法已經(jīng)過時了,但是還是可以使用捐名。
@Override
判斷是不是重寫了父類的方法
自定義注解
格式:
元注解:用來解釋注解的注解
public @interface 注解名稱{
屬性列表;
}
元注解:用于描述注解的注解
@Target:描述注解能夠作用的位置
ElementType取值:
TYPE:可以作用于類上
METHOD:可以作用于方法上
FIELD:可以作用于成員變量上
@Retention:描述注解被保留的階段
@Retention(RetentionPolicy.RUNTIME):當(dāng)前被描述的注解旦万,會保留到class字節(jié)碼文件中,并被JVM讀取到
@Documented:描述注解是否被抽取到api文檔中
@Inherited:描述注解是否被子類繼承
本質(zhì):注解本質(zhì)上就是一個接口镶蹋,該接口默認繼承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
屬性的數(shù)據(jù)類型:
基本數(shù)據(jù)類型
String
枚舉
注解
以上類型的數(shù)組
使用注解的方式加載配置文件信息
* 在程序使用(解析)注解:獲取注解中定義的屬性值
1. 獲取注解定義的位置的對象 (Class成艘,Method,Field)
2. 獲取指定的注解
getAnnotation(Class)
//其實就是在內(nèi)存中生成了一個該注解接口的子類實現(xiàn)對象
public class ProImpl implements Pro{
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show";
}
}
3. 調(diào)用注解中的抽象方法獲取配置的屬性值
關(guān)于注解
1. 以后大多數(shù)時候赏半,我們會使用注解,而不是自定義注解
2. 注解給誰用淆两?
①. 編譯器
②.給解析程序用
3. 注解不是程序的一部分断箫,可以理解為注解就是一個標(biāo)簽