JavaSE查漏补缺:Junit_反射_注解摘要

Part1 Junit单元测试

  • 测试分类

    • 黑盒测试:不需要写代码,给输入值,看程序能否输出期望的值
    • 白盒测试:需要写代码,关注程序具体的执行流程
  • Junit的使用(白盒测试)
    步骤:

    1. 定义一个测试类(测试用例)
      规范:
      • 测试类名是被测试类名 + Test
      • 包名:xxx.xxx.xx.test
    2. 定义测试方法:可独立运行
      规范:
      • 方法名:test + 待测试的方法名
      • 返回值:void
      • 参数列表:空参
    3. 给方法加上 @Test 注解
    4. 导入Junit依赖
  • 判定结果

    • 红色:失败

    • 绿色:成功

    • 一般我们会使用 断言(Assert) 操作来处理结果:

      Assert.assertEquals(期望的结果, 运算的结果);
      

      例如测试Calculator类中的add方法:

      public class CalculatorTest {
          @Test
          public void testAdd(){
              //创建计算器对象
              Calculator c = new Calculator();
              //调用add方法
              int result = c.add(1, 2);
              //断言结果为3
              Assert.assertEquals(3, result);
          }
      }
      
  • 补充:

    @Before:

    @before修饰的方法会在@Test修饰的测试方法执行之前被自动执行,可用于静态资源或外部资源的加载、读取等操作

    @After:

    @After修饰的方法会在@Test修饰的测试方法执行之后被自动执行,可用于静态资源或外部资源的卸载、关闭等操作

    例如:

    public class CalculatorTest {
        @Before
        //在@Test执行之前执行
        public void init(){
            加载静态资源的代码块……
        }
        
        @After
        //在@Test执行之后执行
        public void close(){
            关闭静态资源的代码块……
        }
        
        @Test
        public void testAdd(){
            //创建计算器对象
            Calculator c = new Calculator();
            //调用add方法
            int result = c.add(1, 2);
            //断言结果为3
            Assert.assertEquals(3, result);
        }
    }
    

Part2 反射 - 框架设计的灵魂

  • 框架

    半成品软件,可以在框架的基础上进行软件开发,简化代码

  • 反射

    将类的各个组成部分封装为其他对象

    • 优势:
      1. 可以在程序运行过程中操作这些对象
      2. 可以解耦,提高程序的可扩展性
  • Java代码在计算机中经历的阶段

    1. Source源代码阶段

      .java源文件、.class字节码文件

    2. Class类对象阶段

      .class字节码文件通过ClassLoader加载进内存阶段:

      成员变量:Field[] fields

      构造方法:Constructor[] constructors

      成员方法:Method[] methods

    3. Runtime运行时阶段

      通过 new 关键字创建成对象的阶段

  • 获取class对象的方式:

    1. Class.forName(“全类名”)

      将字节码文件加载进内存,返回Class对象

    2. 类名.class

      通过类名的属性class获取

    3. 对象.getClass()

      getClass()方法在Object类中定义,可以通过该方法获取某对象对应的class对象

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

  • Class对象的常用功能:

    1. 获取成员变量们

      • Field[] getFields() 获取该类所有的public属性
      • Field getField(String name) 获取该类某public属性
      • Field[] getDeclaredFields()获取该类所有的属性
      • Field getDeclaredField(Spring name)获取该类某属性
    2. 获取构造方法们

      • Constructor<T>[] getConstructors()获取该类所有的public构造方法
      • Constructor<T> getConstructor(参数类型……)获取该类某public构造方法
      • Constructor<T> getDeclaredConstructor(参数类型……)获取该类某构造方法
      • Constructor<T>[] getDeclaredConstructors()获取该类所有的public构造方法
    3. 获取对象成员们

      • Method[] getMethods()获取该类所有的public方法

      • Method getMethod(String name, 参数类型……)获取该类某public方法

      • Method[] getDeclaredMethods()获取该类所有的方法

      • Method getDeclaredMethod(String name, 参数类型……)获取该类某方法

    4. 获取类名

      • String getName()

    注意:

    • Field:对象属性
      • 支持get方法
      • 支持set方法
      • 忽略访问权限的安全检查:setAccessible(true);//暴力反射
    • Constructor:构造方法
      • 支持newInstance方法来创建对象,需要传递参数列表
      • 如果使用空参数构造方法创建对象,操作可以简化:使用Class对象的newInstance方法
    • Method:方法对象
      • 支持Object invoke(对象,参数列表),用于执行某方法
      • 支持String getName():获取方法名

    例如:

    class ReflectDemo {
        
        public static void main(String[] args) throws Exception {
            //加载类对象进内存
            Class personClass = Class.forName(xx.xx.Person);
            //获取person类的所有Public属性
            Field[] fields = personClass.getFields();
            //获取Person类的私有属性name
            Field name = personClass.getDeclaredField("name");
            //忽略访问权限修饰符的安全检查(暴力反射)
            name.setAccessible(true);
            name.set(personClass, '张三');
            Object value = name.get(personClass);
            System.out.println(value);
        }
        
    }
    

Part3 Java注解

  • 注解:说明程序的,给计算机看的

  • 注释:用文字描述程序的,给程序员看的

  • 定义:

    注解,也叫元数据,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行解释说明

  • 概述:

    JDK1.5之后的新特性

    说明程序的

    使用方式:@注解名称

  • 作用分类:

    1. 编写文档:通过diamond里标识的注解生成文档

    2. 代码分析:通过代码里标识的注解对代码进行分析(使用反射)

    3. 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【@Override】

  • JDK中预定义的注解

    @Override:检测被该注解标注的方法是否是继承自父类(接口)的

    @Deprecated:该注释标注的内容表示已过时

    @SuppressWarnings:压制警告(用法:@SuppressWarnings(“all”))

  • 自定义注解

  • 在程序中解析注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值