Part1 Junit单元测试
-
测试分类
- 黑盒测试:不需要写代码,给输入值,看程序能否输出期望的值
- 白盒测试:需要写代码,关注程序具体的执行流程
-
Junit的使用(白盒测试)
步骤:- 定义一个测试类(测试用例)
规范:- 测试类名是被测试类名 + Test
- 包名:xxx.xxx.xx.test
- 定义测试方法:可独立运行
规范:- 方法名:test + 待测试的方法名
- 返回值:void
- 参数列表:空参
- 给方法加上 @Test 注解
- 导入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 反射 - 框架设计的灵魂
-
框架
半成品软件,可以在框架的基础上进行软件开发,简化代码
-
反射
将类的各个组成部分封装为其他对象
- 优势:
- 可以在程序运行过程中操作这些对象
- 可以解耦,提高程序的可扩展性
- 优势:
-
Java代码在计算机中经历的阶段
-
Source源代码阶段
.java源文件、.class字节码文件
-
Class类对象阶段
.class字节码文件通过ClassLoader加载进内存阶段:
成员变量:Field[] fields
构造方法:Constructor[] constructors
成员方法:Method[] methods
-
Runtime运行时阶段
通过 new 关键字创建成对象的阶段
-
-
获取class对象的方式:
-
Class.forName(“全类名”)
将字节码文件加载进内存,返回Class对象
-
类名.class
通过类名的属性class获取
-
对象.getClass()
getClass()方法在Object类中定义,可以通过该方法获取某对象对应的class对象
结论:同一个字节码文件(*.class)在一次程序运行过程中只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个
-
-
Class对象的常用功能:
-
获取成员变量们
- Field[] getFields() 获取该类所有的public属性
- Field getField(String name) 获取该类某public属性
- Field[] getDeclaredFields()获取该类所有的属性
- Field getDeclaredField(Spring name)获取该类某属性
-
获取构造方法们
- Constructor<T>[] getConstructors()获取该类所有的public构造方法
- Constructor<T> getConstructor(参数类型……)获取该类某public构造方法
- Constructor<T> getDeclaredConstructor(参数类型……)获取该类某构造方法
- Constructor<T>[] getDeclaredConstructors()获取该类所有的public构造方法
-
获取对象成员们
-
Method[] getMethods()获取该类所有的public方法
-
Method getMethod(String name, 参数类型……)获取该类某public方法
-
Method[] getDeclaredMethods()获取该类所有的方法
-
Method getDeclaredMethod(String name, 参数类型……)获取该类某方法
-
-
获取类名
- 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之后的新特性
说明程序的
使用方式:@注解名称
-
作用分类:
-
编写文档:通过diamond里标识的注解生成文档
-
代码分析:通过代码里标识的注解对代码进行分析(使用反射)
-
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【@Override】
-
-
JDK中预定义的注解
@Override:检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注释标注的内容表示已过时
@SuppressWarnings:压制警告(用法:@SuppressWarnings(“all”))
-
自定义注解
-
在程序中解析注解