Junit 反射、注解

Junit測(cè)試方法,可以替代main方法執(zhí)行測(cè)試代碼。

如何定義測(cè)試方法:

1)不能有返回值,應(yīng)該是void

2)測(cè)試方法需要空參

3)權(quán)限需要public

對(duì)于Junit的測(cè)試方法強(qiáng)制要求格式:公共的,無(wú)參,無(wú)返回值的方法

@Test

public void 方法名(){

測(cè)試邏輯

}

public class Demo01{

publicstaticvoidmain(String[]args) {

System.out.println("Hello World");

newDemo01().show();

?? }

?

@Test

public void show() {

//System.out.println(1/0);

System.out.println("Hello Show? ");

?? }

?

// @Test

// public int getNum(){ //無(wú)效的測(cè)試方法

// ? ? return 100;

// }

?

?

//@Test

//public void showNum(int num) {//Method showNum should have no parameters

// ?? System.out.println(num);

//}

?

?

//@Test

//private void showTest(){ //Method showTest() should be public

// ?? System.out.println();

//}

?

}

2Junit測(cè)試其它常用注解

1.@Test,用于修飾需要執(zhí)行的方法

2.@Before,測(cè)試方法倩執(zhí)行的方法

3@After,測(cè)試方法后執(zhí)行的方法

運(yùn)行時(shí),還可以右鍵運(yùn)行測(cè)試方法的類(lèi),該類(lèi)中所以@Test注解的方法都會(huì)執(zhí)行一遍。

3寫(xiě)Junit測(cè)試方法時(shí),要注意的事情

==這個(gè)方法要求一定要是 無(wú)參無(wú)返回值的公共非靜態(tài)方法==

4反射:Class的理解

Class類(lèi)型是用來(lái)描述java中已存在的或者是程序自己定義的類(lèi)型

所有的類(lèi)型,包括基本數(shù)據(jù)類(lèi)型都有自己的Class對(duì)象

反射的操作其實(shí)就是去剖析這個(gè)Class對(duì)象,以得其構(gòu)造方法,屬性,方法。

5如何獲取Class對(duì)象【反射技術(shù)的基礎(chǔ)】


//獲取User類(lèi)型的字節(jié)碼對(duì)象【Class 對(duì)象】

@Test

public void getClassObj() throws ClassNotFoundException {

? ? //1:借助全類(lèi)名,使用Class.forName(全類(lèi)名) : 全類(lèi)名就是包含包名的類(lèi)名

? ? //User全類(lèi)名:com.itheima.demo02reflect.User

? ? Class<?> cls1 = Class.forName("com.itheima.demo02reflect.User");

? ? //2:類(lèi)名.class

? ? Class<User> cls2 = User.class;

? ? //3):通過(guò)對(duì)象

? ? Class<? extends User> cls3 = new User().getClass();

? ? System.out.println(cls1==cls2); //true

? ? System.out.println(cls1==cls3); //true

}

@Test

public void getBasicTypeClass(){

? ? //基本數(shù)據(jù)類(lèi)型的Class對(duì)象,可以直接使用 類(lèi)型.class

? ? System.out.println(int.class);

? ? System.out.println(boolean.class);

? ? System.out.println(void.class);

}?


6獲取類(lèi)名信息及使用Class對(duì)象創(chuàng)建對(duì)象

1. String getSimpleName(); 獲得簡(jiǎn)單類(lèi)名,只是類(lèi)名,沒(méi)有包

? ? 2. String getName(); 獲取完整類(lèi)名,包含包名+類(lèi)名

? ? 3. T newInstance() ;創(chuàng)建此 Class 對(duì)象所表示的類(lèi)的一個(gè)新實(shí)例。要求:類(lèi)必須有public的無(wú)參數(shù)構(gòu)造方法

? ? */

? ? @Test

? ? public void test() throws IllegalAccessException, InstantiationException {

? ? ? ? Class<User> cls = User.class;

? ? ? ? //將User類(lèi)的類(lèi)名獲取

? ? ? ? //1. String getSimpleName(); 獲得簡(jiǎn)單類(lèi)名,只是類(lèi)名,沒(méi)有包

? ? ? ? System.out.println("cls.getSimpleName() = " + cls.getSimpleName());

? ? ? ? //2. String getName(); 獲取完整類(lèi)名,包含包名+類(lèi)名

? ? ? ? System.out.println("cls.getName() = " + cls.getName());

? ? ? ? //利用Class對(duì)象創(chuàng)建該類(lèi)型 的對(duì)象。

? ? ? ? //3. T newInstance() ;創(chuàng)建此 Class 對(duì)象所表示的類(lèi)的一個(gè)新實(shí)例。要求:類(lèi)必須有public的無(wú)參數(shù)構(gòu)造方法

? ? ? ? User user = cls.newInstance();

? ? ? ? System.out.println("user = " + user);

? ? }

}


7構(gòu)造方法的獲取和使用

/*

如果獲取類(lèi)中的構(gòu)造方法:借助Class中的以下方法

1. Constructor[] getConstructors()

獲取所有的public修飾的構(gòu)造方法

2. Constructor getConstructor(Class... parameterTypes)

根據(jù)參數(shù)類(lèi)型獲取構(gòu)造方法對(duì)象,只能獲得public修飾的構(gòu)造方法。如果不存在對(duì)應(yīng)的構(gòu)造方法,則會(huì)拋出 java.lang.NoSuchMethodException 異常。

?

Constructor構(gòu)造器類(lèi)中常用的方法

1. T new Instance(Object... initargs) ? 根據(jù)指定參數(shù)創(chuàng)建對(duì)象。

2. T new Instance()? 空參構(gòu)造方法創(chuàng)建對(duì)象。

?

?

*/

publicclassDemo03Constructor{

?

//獲取User Class對(duì)象

publicClassgetUserClass() {

returnUser.class;

?? }

?

?

@Test

publicvoidgetAllConstructor() {

Classcls=getUserClass();

?

//Constructor[] getConstructors(): 可以獲取一個(gè)類(lèi)中的所有構(gòu)造方法

Constructor[]cons=cls.getConstructors();

for(Constructorcon:cons) {

System.out.println("con = "+con);

? ? ?? }

?

?

?? }

@Test

publicvoidgetSpecialConstructor()throwsNoSuchMethodException{

// 2. Constructor getConstructor(Class... parameterTypes)

Classcls=getUserClass();// User Class 對(duì)象

Constructorcon1=cls.getConstructor();// 無(wú)參

System.out.println("con1 = "+con1);

//獲取User 中的滿參構(gòu)造方法

Constructorcon2=cls.getConstructor(int.class,String.class,int.class);

System.out.println("con2 = "+con2);

?

?? }

?

//根據(jù)獲取User的構(gòu)造器,去創(chuàng)建對(duì)象

@Test

publicvoidtestCreateUserObj()throwsNoSuchMethodException,IllegalAccessException,InvocationTargetException,InstantiationException{

//以前

Useruser1=newUser(18,"蔡徐坤",200);

System.out.println("user1 = "+user1);

//反射的技術(shù)創(chuàng)建對(duì)象

//1)獲取Class對(duì)象

//2)獲取Class對(duì)象中的構(gòu)造方法對(duì)象

//3)通過(guò)構(gòu)造方法去調(diào)用 newInstance(參數(shù))

Classcls=getUserClass();

//空參

Constructorcon1=cls.getConstructor();

Objectuser2=con1.newInstance();//創(chuàng)建對(duì)象

System.out.println("user2 = "+user2);

?

//滿參構(gòu)造

Constructorcon2=cls.getConstructor(int.class,String.class,int.class);

Objectuser3=con2.newInstance(20,"王伯群",150);

System.out.println("user3 = "+user3);

?

?? }

}


8.方法(Method)對(duì)象的獲取和使用

/*

1)獲取類(lèi)型的Class對(duì)象

2)獲取Class對(duì)象中的方法對(duì)象【Method對(duì)象】

1. Method[] getMethods() 獲取所有的public修飾的成員方法,包括父類(lèi)中

2. Method[] getDeclaredMethods() 獲取【當(dāng)前類(lèi)中所有的方法】,包含私有的,不包括父類(lèi)中

3. Method getMethod("方法名", 方法的參數(shù)類(lèi)型... 類(lèi)型) 根據(jù)方法名和參數(shù)類(lèi)型獲得一個(gè)方法對(duì)象,只能是獲取public修飾的

4. Method getDeclaredMethod("方法名", 方法的參數(shù)類(lèi)型... 類(lèi)型) 根據(jù)方法名和參數(shù)類(lèi)型獲得一個(gè)方法對(duì)象,包括private修飾的

?

注意:如果要獲取本類(lèi)中的非public方法,就需要使用含有Declared的方法獲取

?

3)把方法調(diào)用起來(lái)

1. Object invoke(Object obj, Object... args)

根據(jù)參數(shù)args調(diào)用對(duì)象obj的該成員方法

如果obj=null,則表示該方法是靜態(tài)方法

?

2. void setAccessible(true) 暴力反射,設(shè)置為可以直接調(diào)用私有修飾的成員方法【對(duì)于私有方法使用前需要調(diào)用該方法】

?

?

*/

9屬性(Filed)對(duì)象的獲取和使用

1)獲取類(lèi)對(duì)應(yīng)的Class對(duì)象

2)獲取Class對(duì)象中的屬性對(duì)象:Filed對(duì)象

? ? 1. Field[] getFields() 獲取所有的包括父類(lèi)中public修飾的屬性對(duì)象,返回?cái)?shù)組

? ? 2. Field[] getDeclaredFields() 獲取所有本類(lèi)屬性對(duì)象,包括private修飾的,返回?cái)?shù)組

? ? 3. Field getField(String name)? 根據(jù)屬性名獲得屬性對(duì)象,只能獲取public修飾的

? ? 4. Field getDeclaredField(String name) 根據(jù)屬性名獲得屬性對(duì)象,包括private修飾的

3)可以去訪問(wèn)設(shè)置,獲取Filed對(duì)象的值

? ? 1. Object get(Object obj)? 返回指定對(duì)象上此 Field 表示的字段的值。

? ? 2. void set(Object obj, Object value)? ? ? 將指定對(duì)象變量上此 Field 對(duì)象表示的字段設(shè)置為指定的新值。

? ? 3. void setAccessible(true);? 暴力反射,設(shè)置為可以直接訪問(wèn)私有類(lèi)型的屬性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容