Junit 反射、注解

Junit测试方法,可以替代main方法执行测试代码。

如何定义测试方法:

1)不能有返回值,应该是void

2)测试方法需要空参

3)权限需要public

对于Junit的测试方法强制要求格式:公共的,无参,无返回值的方法

@Test

public void 方法名(){

测试逻辑

}

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(){ //无效的测试方法

//     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测试其它常用注解

1.@Test,用于修饰需要执行的方法

2.@Before,测试方法倩执行的方法

3@After,测试方法后执行的方法

运行时,还可以右键运行测试方法的类,该类中所以@Test注解的方法都会执行一遍。

3写Junit测试方法时,要注意的事情

==这个方法要求一定要是 无参无返回值的公共非静态方法==

4反射:Class的理解

Class类型是用来描述java中已存在的或者是程序自己定义的类型

所有的类型,包括基本数据类型都有自己的Class对象

反射的操作其实就是去剖析这个Class对象,以得其构造方法,属性,方法。

5如何获取Class对象【反射技术的基础】


//获取User类型的字节码对象【Class 对象】

@Test

public void getClassObj() throws ClassNotFoundException {

    //1:借助全类名,使用Class.forName(全类名) : 全类名就是包含包名的类名

    //User全类名:com.itheima.demo02reflect.User

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

    //2:类名.class

    Class<User> cls2 = User.class;

    //3):通过对象

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

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

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

}

@Test

public void getBasicTypeClass(){

    //基本数据类型的Class对象,可以直接使用 类型.class

    System.out.println(int.class);

    System.out.println(boolean.class);

    System.out.println(void.class);


6获取类名信息及使用Class对象创建对象

1. String getSimpleName(); 获得简单类名,只是类名,没有包

    2. String getName(); 获取完整类名,包含包名+类名

    3. T newInstance() ;创建此 Class 对象所表示的类的一个新实例。要求:类必须有public的无参数构造方法

    */

    @Test

    public void test() throws IllegalAccessException, InstantiationException {

        Class<User> cls = User.class;

        //将User类的类名获取

        //1. String getSimpleName(); 获得简单类名,只是类名,没有包

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

        //2. String getName(); 获取完整类名,包含包名+类名

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

        //利用Class对象创建该类型 的对象。

        //3. T newInstance() ;创建此 Class 对象所表示的类的一个新实例。要求:类必须有public的无参数构造方法

        User user = cls.newInstance();

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

    }

}


7构造方法的获取和使用

/*

如果获取类中的构造方法:借助Class中的以下方法

1. Constructor[] getConstructors()

获取所有的public修饰的构造方法

2. Constructor getConstructor(Class... parameterTypes)

根据参数类型获取构造方法对象,只能获得public修饰的构造方法。如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。

Constructor构造器类中常用的方法

1. T new Instance(Object... initargs)   根据指定参数创建对象。

2. T new Instance()  空参构造方法创建对象。

*/

publicclassDemo03Constructor{

//获取User Class对象

publicClassgetUserClass() {

returnUser.class;

   }

@Test

publicvoidgetAllConstructor() {

Classcls=getUserClass();

//Constructor[] getConstructors(): 可以获取一个类中的所有构造方法

Constructor[]cons=cls.getConstructors();

for(Constructorcon:cons) {

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

       }

   }

@Test

publicvoidgetSpecialConstructor()throwsNoSuchMethodException{

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

Classcls=getUserClass();// User Class 对象

Constructorcon1=cls.getConstructor();// 无参

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

//获取User 中的满参构造方法

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

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

   }

//根据获取User的构造器,去创建对象

@Test

publicvoidtestCreateUserObj()throwsNoSuchMethodException,IllegalAccessException,InvocationTargetException,InstantiationException{

//以前

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

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

//反射的技术创建对象

//1)获取Class对象

//2)获取Class对象中的构造方法对象

//3)通过构造方法去调用 newInstance(参数)

Classcls=getUserClass();

//空参

Constructorcon1=cls.getConstructor();

Objectuser2=con1.newInstance();//创建对象

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

//满参构造

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

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

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

   }

}


8.方法(Method)对象的获取和使用

/*

1)获取类型的Class对象

2)获取Class对象中的方法对象【Method对象】

1. Method[] getMethods() 获取所有的public修饰的成员方法,包括父类中

2. Method[] getDeclaredMethods() 获取【当前类中所有的方法】,包含私有的,不包括父类中

3. Method getMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,只能是获取public修饰的

4. Method getDeclaredMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,包括private修饰的

注意:如果要获取本类中的非public方法,就需要使用含有Declared的方法获取

3)把方法调用起来

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

根据参数args调用对象obj的该成员方法

如果obj=null,则表示该方法是静态方法

2. void setAccessible(true) 暴力反射,设置为可以直接调用私有修饰的成员方法【对于私有方法使用前需要调用该方法】

*/

9属性(Filed)对象的获取和使用

1)获取类对应的Class对象

2)获取Class对象中的属性对象:Filed对象

    1. Field[] getFields() 获取所有的包括父类中public修饰的属性对象,返回数组

    2. Field[] getDeclaredFields() 获取所有本类属性对象,包括private修饰的,返回数组

    3. Field getField(String name)  根据属性名获得属性对象,只能获取public修饰的

    4. Field getDeclaredField(String name) 根据属性名获得属性对象,包括private修饰的

3)可以去访问设置,获取Filed对象的值

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

    2. void set(Object obj, Object value)      将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

    3. void setAccessible(true);  暴力反射,设置为可以直接访问私有类型的属性

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容