今日内容
- junit 单元测试
- 反射
- 注释
Junit 单元测试
测试概述
什么是测试? 什么是Junit?
- 测试分两种:
1.白盒测试
2.黑盒测试 - Junit测试:白盒的一种
- 作用:运行部分代码
Junit 使用步骤
- 定义测试类
- 定义测试方法
- 加@Test
- 导入Junit
判定结果
- 绿色:成功
- 红色:失败
- 黄色(!):警告
断言
- Assert
- Assert.assertEquals(期望结果,实际结果);
Junit方法
- 申请资源方法:
- 用于资源申请,优先于所有方法
- @Before
- 释放资源方法:
- 用于释放资源,所有方法结束后必须执行
- @After
Junit注释
- @Test_@Before_@After
反射
反射概述
- 反射:将类的各个组成部分封装成其他对象进行使用.
- 反射的好处:
- 在程序运行过程中,可以动态的获取到一个类的各个组成部分,反向才做这些组成部分.
- 解耦,提高程序的可拓展性.
- 框架:半成品软件,在框架基础上开发可以简化编码.
Class类对象
- 成员变量:Field[] fields
- 成员方法:Method[] methods
- 构造方法:Constructor[] cons
类加载器 ClassLoader
ClassLoader作用
- 找到Class文件位置
- 创建Class对象
获取类加载器对象
- 字节码对象.getClassloader
类加载器加载文件
- getResourceAsStream("文件名称")
- 返回一个输入流
获取字节码对象的三种获取方式
- 类名.class();
- 对象名.getClass();
- 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();
- 获取方法名
注解
作用分类
- 编写文档
- 代码分析
- 编译检查
JDK内置注解
- @Override :检测被该注解标注的方法是否是继承自父类(接口)的
- @Deprecated:该注解标注的内容,表示已过时
- @SuppressWarnings:压制警告
- 一般传递参数all @SuppressWarnings("all")
自定义注解
格式
元注解
public @i@interface 注解名称{
属性列表;
}
本质
- 注解本质上就是一个接口,该接口默认继承Annotation接口
属性
接口中的抽象方法
- 返回值类型取值:
- 基本数据类型
- String
- 枚举
- 注解类型
- 以上数据类型的数组
- 定义了属性,在使用时需要给属性赋值.
- default给属性定义默认值
- 只有一个属性需要赋值,属性名称是value,名称可以省略
- 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
元注解
描述注解的注解
- @Target 描述注解能够作用的位置
- ElementType取值
- TYPE:可以作用于类上
- METHOD:可以作用于方法上
- FIELD:可以作用于成员变量上
- ElementType取值
- @Retention:描述注解被保留的阶段
- @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
- @Documented:描述注解是否被抽取到api文档中
- @Inherited:描述注解是否被子类继承
使用(解析)注解
- 获取注解定义的位置的对象(Class,Method,Field)
- 获取指定的注解对象
- getAnnotation(注解类型.Class)
- 调用注解中的抽象方法获取配置的属性值
方法对.isAnnotationPresent(注解.class)
判断方法上是否有该注解.