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)型的屬性