就业班JavaSE高级部分day14 Junit 反射 注解
JUnit:单元测试
Junit:测试概念
测试代码是否正确,能否达到预期效果
分类:
黑盒测试: 不需要写代码 给定输入值 看程序是否能输出期望的值
白盒测试: 需要写代码, 关注程序的具体执行流程
反射: 框架设计的灵魂
框架: 半成品软件, 可以在框架的基础上进行软件开发,简化代码
反射: 将类的个个组成部分封装成其他对象,成为反射机制
好处:
在程序的运行过程中, 操作这些对象
可以解耦,降低程序的耦合性, 提高程序的可扩展性
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/e5c7c2cf4be3478aae7435ca45803b84/6995398433394c15a462e3ab22a578c2.jpg
获得Class对象的方式:
Source源代码阶段: Class.forName("类名+包名") (将字节码文件加载到内存,返回Class文件)
多用于配置文件
Class类对象阶段: 类名.class(通过类名的属性class获取)
多用于参数传递
RunTime运行时阶段: 对象.getClass(getClass()方法在Object中定义)
多用于获取字节码对象
同一个字节码文件(*.class)文件在一次程序运行中,只会被加载一次, 不论通过哪种方式获取
Class文件对象和都是同一个
使用Class对象功能:
获取的功能
获取成员变量们
获取所有的成员变量
Field[] getFields(): 获取所有 public 的成员变量
Field getField(String name): 获取指定名称的 public 的成员变量
Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符
Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符
获取构造方法们
Constructor<?>[] getConstructors(): 获取所有 public 的构造方法
Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public
构造方法
Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修
饰符
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定
的构造方法, 不考虑权限修饰符
获取成员方法们
Method[] getMethods(): 获取所有 public 的成员方法
Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的
public 成员方法
Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定
的成员方法, 不考虑权限修饰符
获取类名
String getName(): 获取当前Class对象代表的类的全类名
// 其他
T newInstance(): 使用当前类的空参构造创建一个对象
A getAnnotation(Class<A> annotationClass): 获取当前类的注解对象
ClassLoader getClassLoader(): 返回该类的类加载器
.
注解:
注解: Annotation
JDK 1.5 引入. 也叫元数据, 是一种代码级别的说明
它可以声明在包, 类, 字段(成员变量), 方法, 局部变量, 方法参数等的前面, 用来对这些元素进行说明
注解: 说明程序的。给计算机看的
注释: 用文字描述程序的。给程序员看的
使用注解: @注解名称
作用分类:
1. 编写文档: 通过代码里标识的注解生成文档
(生成API文档 @author @version @since @param @return)
2. 代码分析: 通过代码里标识的注解对代码进行分析 (使用反射)
(JUnit提供的 @Test @Before @After)
3. 编译检查: 通过代码里标识的注解让编译器能够实现基本的编译检查
(@Override @FunctionalInterface)
JDK内置注解
JDK中预定义的一些注解:
@Override: 检测被该注解标注的方法是否是"重写"父类(接口)的
@Deprecated: 该注解标注的内容,表示已过时
@SuppressWarnings: 压制警告. 一般传递参数all @SuppressWarnings("all")
自定义注解: 格式和本质
public interface 接口名 {}
自定义注解格式:关键字 @interface
元注解
public @interface 注解名称 {
属性; (接口中的抽象方法)
属性;
属性;
...
}
@注解名称
注解的本质:
注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
自定义注解: 属性定义
属性:
接口中的"抽象方法"
属性的要求:
1. 属性的"返回值类型"可以是以下类型:
基本数据类型(8种)
String
枚举
注解
以上类型的数组
2. 定义了属性,在使用注解时, 需要"给属性赋值" (其实是抽象方法的返回值)
1. 属性使用 default 关键字指定默认值, 则可以不赋值
2. 如果只有一个名为"value"的属性需要赋值, 则 value 可以省略, 直接写值即可
3. 给数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
自定义注解: 元注解
元注解:
用于描述注解的注解
常用元注解:
@Target: 描述注解能够作用的位置
ElementType枚举的常用取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
示例: @Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention: 描述注解被保留的阶段
RetentionPolicy枚举的取值:
SOURCE: 保留到源代码阶段
CLASS: 保留到类对象阶段
RUNTIME: 保留到运行时阶段
示例: @Retention(RetentionPolicy.RUNTIME):保留注解到class字节码文件中并被JVM读取到
@Documented: 加上后, 当前注解会被抽取到api文档中
@Inherited: 加上后, 当前注解会被子类继承
自定义注解: 解析注解
获取注解属性值的步骤:
1. 获取注解定义位置的对象 (Class对象(类注解), Field对象(成员变量注解), Method对象(方法注解))
2. 调用 ProAnno a = cls.getAnnotation(ProAnno.class) 方法获取注解对象
3. 通过注解对象调用抽象方法获取属性值
// 比如获取一个类上的注解
注解类型 注解变量名 = 被注解的类.class.getAnnotation(注解名.class);
数据类型 变量名 = 注解变量名.抽象方法();
ProAnno proAnno = Test.class.getAnnotation(ProAnno.class);
String className = proAnno.className();
String methodName = proAnno.methodName();
|