一、Junit单元测试框架
1.这是一个测试工具,用来测试一个方法的正确性
2.使用步骤
第一步:引入第三方的jar包
第二步:写一个测试方法,在测试方法上,加上@Test注解
第三步:点击绿色按钮执行,如果执行正确,就有绿色的提示
如果执行失败,就有红色的提示
3.常用注解
@Test: 被@Test标记的方法,是测试方法
@Before: 被@Before标记的方法,执行在每一个@Test标记的方法之前
@After: 被@After标记的方法,执行在每一个@Test标记的方法之后
@BeforeClass: 被@BeforeClass标记的方法,执行在所有方法之前,只执行一次
@AfterClass: 被@AfterClass标记的方法,执行在所有测试方法之后,只执行一次
二、反射
1.反射有什么作用?
反射可以用来获取一个类的各个组成成分,各个组成成分其实都是对象
字节码对象: Class表示
构造器对象: Constructor表示
成员变量对象:Field表示
成员方法对象:Method表示
2.获取类的字节码三种方式
方式1: Class clazz1 = Class.forName("包名.类名");
方式2: Class clazz2 = 类名.class;
方式3: Class clazz3 = 对象.getClass();
3.通过反射获取构造器,并执行
//第一步:获取类的字节码
Class clazz = Class.forName("包名.类名");
//第二步:获取一个空参数的构造器
Constructor con = clazz.getConstructor();
//执行构造器,创建类的对象
Object obj = con.newInstance();
//假设还有一个有参数的构造方法,可以获取有参数的构造器
Constrcutor con2= clazz.getDecalaredConstrcutor(参数类型1.class,
参数类型2.class);
//假设构造器是私有的,在使用之前,必须取消权限检查
con2.setAccessible(true);
//执行有参数构造器,创建类的对象
Object obj2 = con2.newInstance(值1, 值2);
4.通过反射获取成员变量,并赋值、或者值
Class<?> clazz = Class.forName("com.itheima.d2_reflect.Student");
Field f1 = clazz.getField("name");
//使用成员变量时,先必须创建一个类的对象
Constructor con = clazz.getConstructor().newInstance();
//给成员变量赋值时、
f1.set(obj, "张三");
//给成员变量获取值
Object v = f1.get(obj);
System.out.println(v);
5.成员方法的反射
//第一步:获取类的字节码
Class<?> clazz = Class.forName("com.itheima.d2_reflect.Student");
//第二步:获取单个成员方法对象
//方法名是test2, 方法的参数是Stirng类型
Method m2 = clazz.getMethod("test2", String.class);
//第三步:执行方法
//利用反射来创建类的对象
Object obj = clazz.getConstructor().newInstance();
m2.invoke(obj,"小明"); //等价于:obj.test2();
二、注解
1.什么是注解
注解其实就是一个标注,它可以给类、给方法、给变量等加上一些标注数据。
2.如何定义注解
//@Target:限定MyAnno注解的使用位置
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
//@Tetention: 限定MyAnno注解能够存活的时间,在运行阶段有效
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno{
}
3.解析注解:通过反射获取类上、方法上、变量上的注解数据
1)如果注解在类上,先获取类的字节码(Class),再通过Class对象类上的注解
2)如果注解在方法上,先获取方法对象(Method),再通过Method对象获取方法上的注解
3)如果注解在成员变量上,先获取成员变量的对象(Field),再通过Fiield对象获取变量上的注解
三、xml文件
1.理解:
xml是一种文件格式,通常用来当做软件的配置文件使用、也可以作为网络数据进行传输(很少用了,被json取代)
2.xml文件的语法规则
1)xml文件必须有一个文档声明,固定写法
<?xml version="1.0" encoding="UTF-8"?>
2)xml文件只能有一个根标签
3)xml文件是由一个一个的标签组成的, 标签可以嵌套,但是不能交叉
<student id="1">
<name>张三</name>
<age>20</age>
</student>
3.xml约束
理解:xml的约束是用来规定一个xml文件中可以些哪些标签
种类:DTD约束(Mybatis框架中会用到)、Schema约束(Spring框架中会用到)
4.xml解析
理解:利用第三方提供的工具类,来读取xml文件中的数据,并且把数据封装Java对象
public class Demo2 {
public static void main(String[] args) throws DocumentException {
//解析Contacts.xml文件,把里面的每一个contact标签中的数据,封装为
一个Contact对象
//1.第一步:创建SAXReader解析器
SAXReader saxReader = new SAXReader();
//第二步:读取xml文件
Document document =
saxReader.read(Demo2.class.getResourceAsStream("/Contacts.xml"));
//第三步:获取根标签
Element root = document.getRootElement();
//准备好一个存储Contact对象的集合
ArrayList<Contact> contacts = new ArrayList<>();
//第四步:获取根标签下所有名称为contact的子标签(只能是第一级)
List<Element> list = root.elements("contact");
for (Element element : list) {
//获取id和vip的属性值
String id = element.attributeValue("id");
String vip = element.attributeValue("vip");
//获取name标签的文本, gender标签的文本, email标签的文本
String name = element.elementText("name");
String gender = element.elementText("gender");
String email = element.elementText("email");
//把读取到的数据封装成对象
//boolean b = Boolean.parseBoolean(vip);
Contact contact = new
Contact(id,Boolean.parseBoolean(vip),name,gender,email);
//把对象添加到集合
contacts.add(contact);
}
//遍历集合
for (Contact contact : contacts) {
System.out.println(contact);
}
}
}
五、设计模式
什么是设计模式(Design pattern)
在开发中经常会遇到一些问题,而一个问题通常会有n中解法,但是其中有一种解法是最优的,这个最优的解法已经被前人总结出来了,这些被前人总结出来的解决特定问题的经验就称之为设计模式
设计模式有20多种,对应20多种软件开发中的问题,学设计模式主要学习2点
- 这种模式解决什么问题?
- 遇到这种问题,该模式怎么写,步骤是怎样的?
单例设计模式解决什么问题?
保证在系统中,运用到该模式的类永远只有一个实例(即只能创建一个对象)
单例设计模式(饿汉式)的设计步骤:
1、把类的构造器私有。
2、创建自己类的对象,并定义一个静态变量记住这个对象。
饿汉单例的实现步骤?
定义一个类,把构造器私有
创建一个自己类的对象,并用静态变量接收。
懒汉单例设计模式
在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。
设计步骤:
定义一个类,把构造器私有。
定义一个用于记住当前对象的静态变量。
提供一个返回单例对象的方法。
什么是工厂设计模式?
设计模式是前人总结出来的,特定问题的解决方案
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。
工厂设计模式的作用:
对象通过工厂的方法创建返回,工厂的方法为该对象进行加工和数据注入。
可以实现类与类之间的解耦操作(核心思想)。
什么是装饰设计模式?
创建一个新类,包装原始类,从而在新类中提升原来类的功能。
装饰设计模式的作用:
作用:装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。
定义父类。
定义原始类,继承父类,定义功能。
定义装饰类,继承父类,包装原始类,增强功能!!