day01_基础加强

今日内容

  • junit 单元测试
  • 反射
  • 注释

Junit 单元测试

测试概述

什么是测试? 什么是Junit?

  • 测试分两种:
    1.白盒测试
    2.黑盒测试
  • Junit测试:白盒的一种
    • 作用:运行部分代码

Junit 使用步骤

  1. 定义测试类
  2. 定义测试方法
  3. 加@Test
  4. 导入Junit

判定结果

  • 绿色:成功
  • 红色:失败
  • 黄色(!):警告

断言

  • Assert
    • Assert.assertEquals(期望结果,实际结果);

Junit方法

  • 申请资源方法:
    • 用于资源申请,优先于所有方法
    • @Before
  • 释放资源方法:
    • 用于释放资源,所有方法结束后必须执行
    • @After

Junit注释

  • @Test_@Before_@After

反射

反射概述

  • 反射:将类的各个组成部分封装成其他对象进行使用.
    • 反射的好处:
    1. 在程序运行过程中,可以动态的获取到一个类的各个组成部分,反向才做这些组成部分.
    2. 解耦,提高程序的可拓展性.
  • 框架:半成品软件,在框架基础上开发可以简化编码.

Class类对象

  • 成员变量:Field[] fields
  • 成员方法:Method[] methods
  • 构造方法:Constructor[] cons

类加载器 ClassLoader

ClassLoader作用

  1. 找到Class文件位置
  2. 创建Class对象

获取类加载器对象

  • 字节码对象.getClassloader

类加载器加载文件

  • getResourceAsStream("文件名称")
    • 返回一个输入流

获取字节码对象的三种获取方式

  1. 类名.class();
  2. 对象名.getClass();
  3. Class.forName("类的全类名")

Class对象方法

Field成员变量

获取

普通获取

  • Field[] getFields():
    • 获取所有public修饰的成员变量
  • Field getField(String name):
    • 获取指定名称的 public修饰的成员变量

暴力获取

  • Field[] getDeclaredFields():
    • 获取所有的成员变量,不考虑修饰符
  • Field getDeclaredField(String name)
    • 获取指定名称的成员变量

操作

设置值

  • void set(Object obj, Object value)

获取值

  • get(Object obj)

忽略权限

  • setAccessible(true)

Constructor构造方法

获取

普通获取

  • Constructor<?>[] getConstructors()
    • 获取全部
  • Constructor<T>getConstructor(类<?>...parameterTypes)
    • 获取指定参数类型的构造方法(类型.calss,void.class,String.class)

暴力获取

  • Constructor<?>[] getDeclaredConstructors()
  • Constructor<T>getDeclaredConstructor(类<?>...parameterTypes)

创建对象

  • 字节码对象.newInstance
    • 调用构造创建对象

Method成员方法

获取

普通获取

  • Method[] getMethods()
  • Method getMethod(String name,类<?>...parameterTypes)
    • 根据(参数类型.class)确定具体方法

暴力获取

  • Method[] getDeclaredMethods()
  • Method getDeclaredMethod(String name,类<?>... parameterTypes)

执行方法

  • Object invoke(Object obj, Object... args)
    • 方法对象.invoke(操作对象,方法需要的参数)

获取方法名称

  • String getName();
    • 获取方法名

注解

作用分类

  1. 编写文档
  2. 代码分析
  3. 编译检查

JDK内置注解

  • @Override :检测被该注解标注的方法是否是继承自父类(接口)的
  • @Deprecated:该注解标注的内容,表示已过时
  • @SuppressWarnings:压制警告
    • 一般传递参数all @SuppressWarnings("all")

自定义注解

格式

元注解
public @i@interface 注解名称{
属性列表;
}

本质

  • 注解本质上就是一个接口,该接口默认继承Annotation接口

属性
接口中的抽象方法

  • 返回值类型取值:
  1. 基本数据类型
  2. String
  3. 枚举
  4. 注解类型
  5. 以上数据类型的数组
  • 定义了属性,在使用时需要给属性赋值.
  1. default给属性定义默认值
  2. 只有一个属性需要赋值,属性名称是value,名称可以省略
  3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

元注解
描述注解的注解

  • @Target 描述注解能够作用的位置
    • ElementType取值
      • TYPE:可以作用于类上
      • METHOD:可以作用于方法上
      • FIELD:可以作用于成员变量上
  • @Retention:描述注解被保留的阶段
    • @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
  • @Documented:描述注解是否被抽取到api文档中
  • @Inherited:描述注解是否被子类继承

使用(解析)注解

  1. 获取注解定义的位置的对象(Class,Method,Field)
  2. 获取指定的注解对象
    • getAnnotation(注解类型.Class)
  3. 调用注解中的抽象方法获取配置的属性值

方法对.isAnnotationPresent(注解.class)
判断方法上是否有该注解.

猜你喜欢

转载自blog.csdn.net/weixin_42651836/article/details/81324888