一、断言
1、断言介绍
1、编译代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言.
2、使用断言可以创建更稳定、品质更好且 不易于出错的代码 。
3、单元测试必须使用断言(Junit/JunitX)。
2、断言方法
方法 | 说明 |
assertEquals | 判断两个对象或两个原始类型是否相等 |
assertNotEquals | 判断两个对象或两个原始类型是否不相等 |
assertSame | 判断两个对象引用是否指向同一个对象 |
assertNotSame | 判断两个对象引用是否指向不同的对象 |
assertTrue | 判断给定的布尔值是否为 true |
assertFalse | 判断给定的布尔值是否为 false |
assertNull | 判断给定的对象引用是否为 null |
assertNotNull | 判断给定的对象引用是否不为 null |
二、反射
1、反射概念
答:反射是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展
2、获取Class类对象的三中方式
1、对象名.getClass()方法
2、类名.class属性
3、Class.forName(全类名)方法
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException {
//获得class的第一种方式
Person p = new Person();
Class class1 = p.getClass();
System.out.println(class1);
//获得class的第二种方式
Class class2 = Person.class;
System.out.println(class2);
//获得class的第三种方式
Class class3 = Class.forName("com.hpf.Person");
System.out.println(class3);
}
}
3、反射获取构造方法并使用
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//获得person的class
Class personClass = Class.forName("com.hpf.Person");
// 1.getConstructor()
//1.1获取public修饰, 指定参数类型所对应的构造方法
Constructor constructor = personClass.getConstructor(Integer.class,String.class,String.class);
System.out.println(constructor);
//2获取public修饰的空参构造
Constructor constructor2 = personClass.getConstructor(null);
System.out.println(constructor2);
}
}
4、Constructor类用于创建对象的方法
方法名 | 说明 |
newInstance() | 根据指定的构造方法创建对象 |
public class Demo3 {
public static void main(String[] args) throws Exception {
//1、获得person的class
Class personClass = Class.forName("com.reflect.Person");
//2、获取public修饰, 指定参数类型所对应的构造方法
Constructor constructor = personClass.getConstructor(Integer.class,String.class,String.class);
//3、创建对象
Object object = constructor.newInstance(1, "tom", "成都");
System.out.println("object = " + object);
}
}
5、反射获取成员变量并使用
方法名 | 说明 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
public class Test{
public static void main(String[] args) throws Exception {
//获得person的class
Class personClass = Class.forName("com.hpf.Person");
//1.获取指定的变量
Field field = personClass.getDeclaredField("name");
System.out.println(field);
//2.获得所有成员变量
Field[] fields = personClass.getDeclaredFields();
for (Field field1 : fields) {
System.out.println("field1 = " + field1);
}
}
}
6、Field类用于给成员变量赋值的方法
方法名 | 说明 |
void set(Object obj,Object value) | 给obj对象的成员变量赋值为value |
public class Test{
public static void main(String[] args) throws Exception {
//获得person的class
Class personClass = Class.forName("com.hpf.Person");
//获得空参构造
Constructor constructor = personClass.getConstructor(null);
//通过空参构造创建对象
Object obj = constructor.newInstance();
//1.获取指定的变量
Field field = personClass.getDeclaredField("name");
//2.暴力反射后, 破解private修饰
field.setAccessible(true);
//3.给obj对象的name属性赋值
field.set(obj,"苏沐橙");
System.out.println(obj);
}
}
7、反射获取成员方法并使用
方法名 | 说明 |
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method getMethod(String name, Class<?>... parameterTypes) | 返回单个公共成员方法对象 |
public class Test{
public static void main(String[] args) throws Exception {
//获得person的class
Class forName = Class.forName("com.hpf.Person");
//获得public修饰的单个方法,知道方法名称和传入参数
Method method = forName.getMethod("getName",null);
System.out.println(method);
Method[] methods = forName.getMethods();
for (Method method2 : methods) {
System.out.println(method2);
}
}
}
8、Method类用于执行方法的方法
方法名 | 说明 |
Object invoke(Object obj,Object... args) | 调用obj对象的成员方法,参数是args,返回值是Object类型 |
public class Demo7 {
public static void main(String[] args) throws Exception {
//获得person的class
Class forName = Class.forName("com.hpf.Person");
//创建对象
Constructor constructor = forName.getConstructor(null);
Object obj = constructor.newInstance();
//获取方法
Method method = forName.getMethod("setName", String.class);
//执行方法
method.invoke(obj, "苏沐橙");
System.out.println(obj);
}
}