14Junit、反射、注解
14.1.1 Junit的概述 一般IDE都内置了junit,若需要自行下载jar包,
- 特点
- 方法命名规则:以test开头,使用驼峰命名法。
- 方法声明上:必须使用注解:@Test,必须使用public修饰符,没有返回值,方法没有参数。
- 运行测试方法
- 选中方法名:右键 –> Run 测试方法名,则运行选中的测试方法
比如测试方法名为testSum,则右键 –> Run testSum
- 选中类名:右键 –> Run 类名,则运行该类的所有测试方法
比如类名为TestCalculte,则右键 –> Run TestCalculte
- 选中模块名或项目名:右键 –> Run ‘All Tests’,则运行整个模块中所有类的所有测试方法。 - 查看测试结果
- 绿色:表示测试通过,
- 红色:表示失败或出现错误,
14.1.2 常用注解
- @Before:在每个测试方法之前都会运行一次
- @After:在每个测试方法运行以后运行的方法
- @BeforeClass:在所有的测试方法运行之前,只运行一次,而且必须用在静态方法上面。
- @AfterClass:所有的测试方法运行以后,只运行一次,必须用在静态方法上面。
- 业务类
•
/**
业务类
*/
public class Calculate {
/*
求a和b之和
*/
public int sum(int a,int b){
return a + b;
}
/**
求a和b之差
*/
public int sub(int a,int b){
return a - b;
}
}
• 测试类
import org.junit.*;
public class Test2 {
@BeforeClass
public static void testBeforeClass() {
System.out.println(“类加载时, 只运行一次.”);
}
@Before
public void testBefore() {
System.out.println(“测试方法运行前被执行 …”);
}
@Test
public void testSum() {
Calculator calculator = new Calculator();
int sum = calculator.sum(10, 20);
System.out.println(“sum = ” + sum);
}
@Test
public void testSub() {
Calculator calculator = new Calculator();
int sub = calculator.sub(100, 20);
System.out.println(“sub = ” + sub);
}
@After
public void testAfter() {
System.out.println(“每个测试方法被执行后执行 …”);
}
@AfterClass
public static void testAfterClass() {
System.out.println(“类结束前, 只执行一次.”);
}
}
输出结果 :
类加载时, 只运行一次.
测试方法运行前被执行 …
sub = 80
每个测试方法被执行后执行 …
测试方法运行前被执行 …
sum = 30
每个测试方法被执行后执行 …
类结束前, 只执行一次.
14.2 反射
14.2.1 反射的基本概念
2.1 什么是反射
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法等成员。
2.2 使用反射机制解剖类的前提
必须先要获取到该类的字节码文件对象,即Class类型对象。关于Class描述字节码文件如下图所示:
tips:
1)Java中使用Class类表示某个class文件.
2)任何一个class文件都是Class这个类的一个实例对象.
2.3 获取Class对象的三种方式
- 创建测试类:Student
public class Student {
// 属性
// 行为
}
- 2.2.1 方式1:通过类名.class获取
• @Test
public void test1() {
// 方式一 : 通过类名获取 class 对象
// 格式 : 类名.class 属性
// 常用场景 : 反射获取方法时, 确定方法的形参列表类型
Class cls = Student.class;
System.out.println(“cls = ” + cls);
}
输出结果 :
cls = class cn.itcast.test2.Student
2.2.2 方式2:通过Object类的成员方法getClass()方法获取
@Test
public void test2() {
// 1. 创建一个 Student 类型的对象
Student stu = new Student();
// 2. 调用方法, 并传入 stu 对象
showInfo(stu);
}
public void showInfo(Object obj) {
// 方式二 : 使用对象名调用 getClass() 方法.
// 格式 : 对象名.getClass() 方法.
// 使用场景 : 在方法内部, 确定传入形参的真实类型.
Class