Junit、反射、注解

Junit、反射、注解

junit单元测试

测试分类:

  1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值
  2. 白盒测试:需要写代码的。关注程序的具体执行流程

junit使用:白盒测试

  • 步骤:
    1. 定义一个测试类(测试用例)
      • 建议:
        • 测试类名:被测试的类名Test CalculatorTest
        • 包名:xxx.xxx.xx.test cn.itcast.test
    2. 定义测试方法:可以独立运行
      • 建议:
        • 方法名:test测试的方法名 testAdd()
        • 返回值:void
        • 参数列表:空参数
    3. 给方法加@Test
    4. 导入junit依赖环境
  • 判定结果:
    • 红色:失败
    • 绿色:成功
    • 一般我们会使用断言操作来处理结果
      • Assert.assertEquals(期望的结果,运算的结果);
  • 补充:
    • @Before:修饰的方法会在测试方法执行之前自动执行
    • @After:修饰的方法会在测试方法执行之后自动执行

反射(框架设计的灵魂)

概念

**框架(半成品软件):**可以在框架的基础上进行软件开发,简化编码

**反射:**将类的各个组成部分封装为其他对象,这就是反射机制

在这里插入图片描述

反射的好处:

  1. 可以在程序运行过程中,操作这些对象
  2. 可以解耦,来提高程序的可扩展性

获取Class对象的三种方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
    • 多用于配置文件,将类名定义在配置文件中,读取文件,加载类
  2. 类名.class:通过类名的属性class获取
    • 多用于参数的传递
  3. 对象.getClass():getClass()方法在Object类中定义着
    • 多用于对象的获取字节码的方式

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个

Class对象功能

获取功能
  1. 获取成员变量

    • Field[] getFields():获取所有public修饰的成员变量

    • Field getField(string name):获取指定名称的public修饰的成员变量

    • Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符

    • Field getDeclaredField(string name):获取指定名称的成员变量

    Field:成员变量

    • 操作:
      1. 设置值:void set(Object obj, Object value)
      2. 获取值:get(Object obj)
      3. 忽略访问权限修饰符的安全检查:setAccessible(true)暴力反射
    import java.lang.reflect.Field;
    
    public class Demo01Reflect {
         
        public static void main(String[] args) throws Exception {
         
            //0.获取Person的Class对象
            Class personClass = Person.class;
    
            /*
                获取成员变们:
                    - Field[] getFields()
                    - Field getField(string name)
                    - Field[] getDeclaredFields()
                    - Field getDeclaredField(string name)
             */
            //1.Field[] getFields()
            Field[] fields = personClass.getFields();
            for (Field field : fields) {
         
                System.out.println(field);
            }
    
            System.out.println("--------------------");
            //2.Field getField(string name)
            Field a = personClass.getField("a");
            //获取成员变量a的值
            Person p = new Person();
            Object value = a.get(p);
            System.out.println(value);
            //设置a的值
            a.set(p,"张三");
            System.out.println(p);
    
            System.out.println("--------------------");
            //3.Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
            Field[] declaredFields = personClass.getDeclaredFields();
            for (Field declaredField : declaredFields) {
         
                System.out.println(declaredField);
            }
            //4.Field getDeclaredField(string name)
            Field d = personClass.getDeclaredField("d");
            //忽略访问权限修饰符的安全检查
            d.setAccessible(true);//暴力反射
            Object value2 = d.get(p);
            System.out.println(value2);
        }
    }
    
  2. 获取构造方法

    • Constructor<?>[] getConstructors():获取所有public修饰的构造方法
    • Constructor<T> getConstructor(类<?>... parameterTypes):获取指定名称的public修饰的构造方法
    • Constructor<T> getDeclaredConstructor(类<?>... parameterTypes):获取指定名称的构造方法
    • Constructor<?>[] getDeclaredConstructors():获取所有的构造方法,不考虑修饰符

    Constructor:构造方法

    • 创建对象:T newInstance(Object... initargs)
    • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
    import java.lang.reflect.Constructor;
    
    public class Demo02Reflect {
         
        public static void main(String[] args) throws Exception {
         
            //0.获取Person的Class对象
            Class personClass = Person.class;
    
            /*
                获取构造方法们
                    - Constructor<?>[] getConstructors()
                    - Constructor<T> getConstructor(类<?>... parameterTypes)
                    - Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
                    - Constructor<?>[] getDeclaredConstructors()
             */
            //- Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
            Constructor constructor = personClass.getConstructor(String.class, int.class);
            System.out.println(constructor);
            //创建对象
            Object person = constructor.newInstance("张三", 23);
            System.out.println(person);
    
            System.out.println("-------------------");
            Constructor constructor1 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZXLzhuzhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值