Junit单元测试

黑盒测试:

不需要写代码,只需要给输入值,看程序是否达到期望值

白盒测试:

需要写代码的,看程序执行的具体过程—-如:Junit单元测试
image.png
image.png
不能传参

@Before @After

image.png

  1. package com.igeek_01;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-18-9:29
  5. */
  6. import org.junit.After;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. /**
  10. * junit测试适用于代码的测试,是单元测试用于替代main方法
  11. */
  12. public class JunitTest01 {
  13. @Test
  14. public void test01(){
  15. System.out.println("运行1通过");
  16. }
  17. @Test
  18. public void test02(){
  19. System.out.println("运行2通过");
  20. }
  21. /**
  22. * @Before
  23. * @After
  24. */
  25. @Before
  26. public void Before(){
  27. System.out.println("在@Test方法之前运行");
  28. }
  29. @After
  30. public void after(){
  31. System.out.println("在@Test方法之后运行");
  32. }
  33. }
  34. 运行结果:
  35. @Test方法之前运行
  36. 运行1通过
  37. @Test方法之后运行
  38. @Test方法之前运行
  39. 运行2通过
  40. @Test方法之后运行

image.png

  1. package com.igeek_01;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-18-10:00
  5. */
  6. /**
  7. * Junit测试类也是一个普通的类,也可以实例化
  8. */
  9. public class JunitTest02 {
  10. public static void main(String[] args) {
  11. //实例化这个类
  12. JunitTest01 test01=new JunitTest01();
  13. test01.test01();
  14. test01.after();
  15. test01.Before();
  16. }
  17. }
  18. 运行结果:
  19. 运行1通过
  20. @Test方法之后运行
  21. @Test方法之前运行

反射机制—reflect

定义:

  1. ** ****是在运行状态中,在任意一个类中,都能够知道他的所有的属性和方法;对于任意一个对象,都能够调用他的所有的属性和方法,这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制。**<br />** 每一个类,都会被appclassloader加载到方法区,生成Class类型的对象**<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/2706946/1608257742267-bfac0e72-fb3b-4b95-8f8c-e8085272ecf2.png#align=left&display=inline&height=261&margin=%5Bobject%20Object%5D&name=image.png&originHeight=317&originWidth=905&size=198818&status=done&style=none&width=746)

获取类对象的方法

1.使用类:Class clazz=Student.class;
2.使用全类名(包名.类名)—比较常用—安全
Class clazz=Class.forName(“com.igeek_02.Student”);
3.使用对象:
Student s=new Student();
Class clazz=s.getClass();
image.png
image.png

  1. package com.igeek_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-18-10:11
  5. */
  6. /**
  7. * 实体类
  8. * 用于测试反射
  9. */
  10. public class Student {
  11. //字段--属性
  12. public int id;
  13. private String name;
  14. //构造
  15. public Student() {
  16. super();
  17. }
  18. public Student(int id, String name) {
  19. super();
  20. this.id = id;
  21. this.name = name;
  22. }
  23. //方法
  24. public int getId() {
  25. return id;
  26. }
  27. public void setId(int id) {
  28. this.id = id;
  29. }
  30. public String getName() {
  31. return name;
  32. }
  33. //私有方法--用于测试
  34. private void setName(String name) {
  35. this.name = name;
  36. }
  37. //静态方法
  38. public static int getCount(int c){
  39. return c*10;
  40. }
  41. @Override
  42. public String toString() {
  43. return "Student{" +
  44. "id=" + id +
  45. ", name='" + name + '\'' +
  46. '}';
  47. }
  48. }
  1. package com.igeek_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-18-10:04
  5. */
  6. import org.junit.Test;
  7. /**
  8. * java反射机制
  9. *
  10. * 目前讲反射是讲解反射的使用
  11. */
  12. public class ReflectDemo {
  13. //单元测试
  14. @Test
  15. public void test1(){
  16. //已知明确的类型,获取Class对象
  17. Class clazz=Student.class;
  18. System.out.println(clazz);//class com.igeek_02.Student
  19. }
  20. @Test
  21. public void test2(){
  22. //已知对象,获取Class对象
  23. Student s=new Student();
  24. Class clazz=s.getClass();//getClass()是顶级父类Object中的方法
  25. System.out.println(clazz);//class com.igeek_02.Student
  26. }
  27. @Test
  28. public void test3() throws ClassNotFoundException {
  29. //完全限定名(包名.类名),获取Class对象--比较常用--安全
  30. String className="com.igeek_02.Student";
  31. //forName()返回这个地址值所对应的类
  32. Class clazz=Class.forName(className);
  33. System.out.println(clazz);//class com.igeek_02.Student
  34. }
  35. //测试结果:通过不同的反射获取的对象是同一个!!
  36. @Test
  37. public void test4() throws ClassNotFoundException {
  38. //第一种
  39. Class clazz1=Student.class;
  40. //第二种
  41. Student s=new Student();
  42. Class clazz2=s.getClass();
  43. //第三种
  44. String className="com.igeek_02.Student";
  45. Class clazz3=Class.forName(className);
  46. //比较
  47. System.out.println(clazz1==clazz2);
  48. System.out.println(clazz1==clazz3);
  49. System.out.println(clazz3==clazz2);
  50. }
  51. }
  1. package com.igeek_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-18-10:31
  5. */
  6. import org.junit.Test;
  7. import java.lang.reflect.Constructor;
  8. import java.lang.reflect.InvocationTargetException;
  9. /**
  10. * 通过java的反射机制构建对象的测试
  11. */
  12. public class ReflectDemo2 {
  13. @Test
  14. public void test01() throws IllegalAccessException, InstantiationException {
  15. //类中有无参构造
  16. Class clazz=Student.class;
  17. Object obj=clazz.newInstance();//默认调用的是无参的--创建实例
  18. System.out.println(clazz);//class com.igeek_02.Student
  19. System.out.println(obj);//Student{id=0, name='null'}--
  20. // 当前的object进行了向下转型给了反射获取到的类Student
  21. }
  22. @Test
  23. public void test02() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
  24. //获取Class类中的构造函数对象
  25. Class clazz=Student.class;
  26. //获取到有参构造函数
  27. Constructor con= clazz.getConstructor(int.class, String.class);
  28. Object obj = con.newInstance(20, "Tom");
  29. System.out.println(obj);//Student{id=20, name='Tom'}
  30. }
  31. //演示普通的方式实例化对象做不到的事情
  32. @Test
  33. public void test03(){
  34. Student s=new Student();
  35. s.setId(1);
  36. // s.setName();//不能进行name赋值,因为方法是私有的
  37. System.out.println(s);//Student{id=1, name='null'}
  38. }
  39. }
  1. package com.igeek_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-18-11:14
  5. */
  6. import com.sun.deploy.xml.XMLable;
  7. import org.junit.Test;
  8. import java.lang.reflect.InvocationTargetException;
  9. import java.lang.reflect.Method;
  10. /**
  11. * 反射处理静态方法
  12. */
  13. public class ReflectDemo3 {
  14. @Test
  15. public void test01(){
  16. //静态方法的调用--普通
  17. int count=Student.getCount(10);
  18. System.out.println(count);//100
  19. }
  20. @Test
  21. public void test02() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
  22. //静态方法的调用--利用反射机制处理
  23. //1.创建Class
  24. String className="com.igeek_02.Student";
  25. Class clazz=Class.forName(className);
  26. //2.调用静态方法
  27. Method hetCount = clazz.getMethod("getCount", int.class);
  28. //3.根据类型传参--invoke方法表示映射,这里因为不需要实例,所以可以传参null
  29. Object obj=hetCount.invoke(null,2);
  30. System.out.println(obj);//20
  31. }
  32. }

获取字段—Field—-获取值和修改值

image.png
image.png
image.png

  1. package com.igeek.ziduan;
  2. import org.junit.Test;
  3. import java.lang.reflect.Field;
  4. /**
  5. * @author Lynn
  6. * @create 2020-12-21-9:31
  7. */
  8. public class FieldTest01 {
  9. //利用反射机制处理公共字段
  10. @Test
  11. public void test2() throws Exception{
  12. //获取类
  13. Class clazz=Class.forName("com.igeek.ziduan.Student");
  14. //创建实例对象
  15. Object o = clazz.newInstance();
  16. //处理字段
  17. Field id = clazz.getField("id");
  18. id.set(o,30);
  19. System.out.println(o);
  20. //通过key获取值
  21. Object o1 = id.get(o);
  22. System.out.println(o1);
  23. }
  24. //利用反射机制处理私有字段
  25. @Test
  26. public void test3() throws Exception{
  27. //获取类
  28. Class clazz=Class.forName("com.igeek.ziduan.Student");
  29. //创建实例对象
  30. Object o = clazz.newInstance();
  31. //处理字段
  32. Field name = clazz.getDeclaredField("name");
  33. System.out.println(name);//private java.lang.String com.igeek.ziduan.Student.name
  34. //打破私有权限
  35. name.setAccessible(true);
  36. name.set(o,"Lynn");
  37. System.out.println(o);//Student{id=0, name='Lynn'}
  38. //通过key获取值
  39. Object o1 = name.get(o);
  40. System.out.println(o1);//Lynn
  41. }
  42. }

获取方法—-invoke—用来调用

image.png

构造方法—-核心是用来构造对象的—new对象

image.png
image.png

讲解Properties使用

映射—在properties中使用Map—通过键找到值
image.png

  1. package com.igeek.properties;
  2. import org.junit.Test;
  3. import java.io.*;
  4. import java.util.Properties;
  5. /**
  6. * @author Lynn
  7. * @create 2020-12-21-9:47
  8. */
  9. public class PropertiesDemo {
  10. //第一种方式:添加内容,使用Map中的方法--put
  11. @Test
  12. public void test1() throws IOException {
  13. //保存properties的数据到流中--void store(OutputStream out,String content)
  14. Properties prop=new Properties();
  15. prop.put("id","100");
  16. prop.put("name","Lynn");
  17. prop.store(new FileOutputStream("t.txt"),"要写入的内容");//内容的Unicode
  18. }
  19. //读取流--void load(InputStream in)
  20. @Test
  21. public void test2() throws IOException {
  22. Properties prop=new Properties();
  23. //读取
  24. prop.load(new FileInputStream("t.txt"));
  25. System.out.println(prop);//{name=Lynn, id=100}
  26. //
  27. String id = prop.getProperty("id");
  28. System.out.println(id);
  29. String name = prop.getProperty("name");
  30. System.out.println(name);
  31. }
  32. //第二种方式:使用properties方法设置数据--setProperty
  33. @Test
  34. public void test3() throws IOException {
  35. Properties prop=new Properties();
  36. prop.setProperty("id","20");
  37. prop.setProperty("name","Cheery");
  38. prop.store(new FileOutputStream("t2.txt"),"过");
  39. // System.out.println(prop);//{name=Cheery, id=20}
  40. //通过key获取值
  41. String id = prop.getProperty("id");
  42. String name = prop.getProperty("name");
  43. /*String id = prop.getProperty("id1");
  44. System.out.println(id);*///如果key炸不到则返回null
  45. // System.out.println(name);
  46. }
  47. //读取
  48. @Test
  49. public void test4() throws IOException {
  50. Properties prop=new Properties();
  51. prop.load(new FileInputStream("t2.txt"));
  52. System.out.println(prop.get("id"));
  53. System.out.println(prop.get("name"));
  54. }
  55. }

配置文件—利用properties类实现不修改源码的基础上处理数据

注意:从**properties**中获取的都是字符串类型
image.png
image.png
image.png

  1. package com.igeek.config;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-21-10:32
  5. */
  6. import org.junit.Test;
  7. import java.io.FileInputStream;
  8. import java.io.FileNotFoundException;
  9. import java.io.FileReader;
  10. import java.io.IOException;
  11. import java.lang.reflect.Constructor;
  12. import java.lang.reflect.InvocationTargetException;
  13. import java.util.Properties;
  14. /**
  15. * 利用properties类实现不修改源码的基础上处理数据
  16. */
  17. public class ConfigTest {
  18. @Test
  19. public void test1(){
  20. //测试学生和老师的对象
  21. Student s=new Student(54,"Lynn");
  22. System.out.println(s);
  23. Teacher t=new Teacher(54,"Lynn");
  24. System.out.println(t);
  25. }
  26. /**
  27. *从配置文件className中读取要获取哪一个类
  28. * 好处:获取哪个类直接修改配置文件,不需要修改源代码
  29. * 1.首先要获取配置文件
  30. */
  31. @Test
  32. public void test2() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
  33. //从className中读取类名
  34. Properties prop=new Properties();
  35. //加载配置文件并且读取
  36. prop.load(new FileReader("className.properties"));
  37. //根据key获取value
  38. String className= prop.getProperty("className");
  39. System.out.println(className);//com.igeek.config.Teacher
  40. //创建类的实例--反射
  41. Class clazz=Class.forName(className);
  42. //找到该类的构造器--有参
  43. Constructor constructor = clazz.getConstructor(int.class, String.class);
  44. //利用构造函数处理数据
  45. Object o = constructor.newInstance(54, "Lynn");
  46. System.out.println(o);
  47. }
  48. /**
  49. * 从配置文件data.properties中读取数据并且填入实例
  50. *
  51. */
  52. @Test
  53. public void test3() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
  54. //从className中读取类名
  55. Properties prop=new Properties();
  56. //加载配置文件并且读取
  57. prop.load(new FileReader("className.properties"));
  58. //根据key找到value
  59. String className = prop.getProperty("className");
  60. //创建实例
  61. Class clazz=Class.forName(className);
  62. //构造函数中进行处理
  63. //1.从data配置文件中获取数据
  64. Properties prop_Data=new Properties();
  65. prop_Data.load(new FileReader("data.properties"));
  66. String v_id = prop_Data.getProperty("id");
  67. String v_name = prop_Data.getProperty("name");
  68. System.out.println(v_id+v_name);
  69. //将数据写入对象
  70. Constructor constructor = clazz.getConstructor(int.class, String.class);
  71. //从properties中获取的都是字符串类型,所以要强制转换为int类型--parseInt
  72. Object o = constructor.newInstance(Integer.parseInt(v_id),v_name);
  73. System.out.println(o);
  74. }
  75. }

BeanUtils工具类

image.png
image.png

  1. package com.igeek.user;
  2. import org.apache.commons.beanutils.BeanUtils;
  3. import org.junit.Test;
  4. import java.lang.reflect.InvocationTargetException;
  5. /**
  6. * @author Lynn
  7. * @create 2020-12-21-11:27
  8. */
  9. public class BeanUtilsDemo {
  10. //常规的--调用get/set方法
  11. @Test
  12. public void test1(){
  13. User use=new User();
  14. use.setUid("u001");
  15. use.setUsername("Lynn");
  16. System.out.println(use);//User{uid='u001', username='Lynn', password='null', hobbies=null, age=0}
  17. }
  18. //使用BeanUtils工具进行封装--底层调用的还是get/set方法
  19. @Test
  20. public void test2() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
  21. User use=new User();
  22. //
  23. BeanUtils.setProperty(use,"uid","u002");
  24. //封装配置文件
  25. BeanUtils.setProperty(use,"username","Cheery");
  26. BeanUtils.setProperty(use,"password","123");
  27. System.out.println(use);//User{uid='u002', username='Cheery', password='123', hobbies=null, age=0}
  28. //获取值
  29. System.out.println(BeanUtils.getProperty(use, "username"));//Cheery
  30. //如果找不到会报错
  31. /*System.out.println(BeanUtils.getProperty(use, "username1"));
  32. //java.lang.NoSuchMethodException: Unknown property 'username1' on class 'class com.igeek.user.User'*/
  33. }
  34. }

image.png
BeanUtils**类的populate(Object bean, Map properties):
将Map数据封装到指定Javabean中,一般用于将表单的所有数据封装到javabean。**

  1. package com.igeek.user;
  2. import org.apache.commons.beanutils.BeanUtils;
  3. import org.junit.Test;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * @author Lynn
  9. * @create 2020-12-21-11:27
  10. */
  11. /**
  12. * BeanUtils的方法讲解
  13. */
  14. public class BeanUtilsDemo1 {
  15. //使用populated方法进行填充数据方法1
  16. @Test
  17. public void test1() throws InvocationTargetException, IllegalAccessException {
  18. //1.模拟数据,创建map,填充所需要的数据
  19. Map<String,String[]> map=new HashMap<>();
  20. map.put("uid",new String[]{"u007"});
  21. map.put("username",new String[]{"王嘉尔"});
  22. map.put("password",new String[]{"123"});
  23. //2.使用populate方法进行填充
  24. User user=new User();
  25. BeanUtils.populate(user,map);
  26. System.out.println(user);
  27. }
  28. //使用BeanUtils工具进行封装--底层调用的还是get/set方法
  29. @Test
  30. public void test2() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
  31. Map<String,String[]> map=new HashMap<>();
  32. map.put("uid",new String[]{"u008"});
  33. //底层:就是调用了setUsername方法
  34. map.put("username",new String[]{"郭靖","黄蓉"});
  35. map.put("password",new String[]{"123"});
  36. map.put("hobbies",new String[]{"降龙十八掌","碧海潮生曲","打狗十八式"});
  37. map.put("age",new String[]{"45"});
  38. //2.使用populate方法进行填充
  39. /**
  40. * 可以指定属性,统一进行填充,需要的类型是数组[]
  41. * 如果属性不是数组,将使用map.value表示数组中的第一个数据--
  42. * 黄蓉不是第一个数据,所以不见了
  43. * BeanUtils支持的类型:基本类型和基本类型对应的包装类,
  44. * 自动将字符串转换为基本类型--自己做的
  45. */
  46. User user=new User();
  47. BeanUtils.populate(user,map);
  48. System.out.println(user);//User{uid='u008', username='郭靖', password='123', hobbies=[降龙十八掌, 碧海潮生曲, 打狗十八式], age=45}
  49. }
  50. }

自定义BeanUtils工具类

image.png

  1. package com.igeek.user;
  2. import org.apache.commons.beanutils.BeanUtils;
  3. import org.junit.Test;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * @author Lynn
  9. * @create 2020-12-21-11:27
  10. */
  11. /**
  12. * 自定义BeanUtils工具类
  13. */
  14. public class BeanUtilsDemo2 {
  15. //自动填充
  16. public static void populate(Object bean,Map<String,String[]> properties){
  17. try {
  18. BeanUtils.populate(bean,properties);
  19. } catch (Exception e) {
  20. throw new RuntimeException(e);
  21. }
  22. }
  23. //自动填充的方法,并且返回bean对象
  24. public static Object populate(Class beanClass,Map<String,String[]> properties){
  25. try {
  26. Object bean = beanClass.newInstance();
  27. //
  28. BeanUtils.populate(bean,properties);
  29. return bean;
  30. } catch (Exception e) {
  31. throw new RuntimeException(e);
  32. }
  33. }
  34. }
  1. package com.igeek.user;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-21-15:07
  5. */
  6. import org.apache.commons.beanutils.BeanUtils;
  7. import org.junit.Test;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * 测试自定义的方法--populate
  12. */
  13. public class MyBeanUtilsTest {
  14. //测试没有返回值的方法
  15. @Test
  16. public void test1(){
  17. Map<String,String[]> map=new HashMap<>();
  18. map.put("uid",new String[]{"u007"});
  19. map.put("username",new String[]{"王嘉尔"});
  20. map.put("password",new String[]{"123"});
  21. //2.使用populate方法进行填充
  22. User user=new User();
  23. BeanUtilsDemo2.populate(user,map);
  24. System.out.println(user);
  25. }
  26. //测试有返回值的方法
  27. @Test
  28. public void test2(){
  29. Map<String,String[]> map=new HashMap<>();
  30. map.put("uid",new String[]{"u007"});
  31. map.put("username",new String[]{"王嘉尔"});
  32. map.put("password",new String[]{"123"});
  33. //2.使用populate方法进行统一的填充--向下转型--因为自己封装的方法返回的是Object类型,
  34. //所以如果要获取,指定的类型就必须向下转型
  35. User user = (User) BeanUtilsDemo2.populate(User.class, map);//向下转型
  36. System.out.println(user);
  37. }
  38. }

带泛型的自定义工具类

  1. package com.igeek.MyBeanUtils;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-21-15:53
  5. */
  6. import org.apache.commons.beanutils.BeanUtils;
  7. import org.apache.commons.beanutils.BeanUtilsBean;
  8. import java.lang.reflect.InvocationTargetException;
  9. import java.util.Map;
  10. /**
  11. * MyBeanUtils泛型使用
  12. */
  13. public class MyBeanUtils {
  14. /**
  15. *
  16. * @param beanClass
  17. * @param properties
  18. * @return
  19. *
  20. * Class<T>此时这个T就是一个变量,在运行的时候,接收具体的类型。例如:User
  21. * 变量必须先定义再使用
  22. * 泛型变量的定义方式,修饰符<变量名> 返回值
  23. */
  24. public static <T> T populate(Class<T> beanClass, Map<String,String[]> properties){
  25. try {
  26. //1.使用反射机制实例化
  27. T bean=beanClass.newInstance();
  28. //2.填充数据
  29. BeanUtils.populate(bean,properties);
  30. //返回数据
  31. return bean;
  32. } catch (Exception e) {
  33. throw new RuntimeException(e);
  34. }
  35. }
  36. }
  1. package com.igeek.MyBeanUtils;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-21-16:00
  5. */
  6. import com.igeek.user.User;
  7. import org.junit.Test;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * 测试自定义泛型的BeanUtils
  12. */
  13. public class MyBeanUtilsTest {
  14. @Test
  15. public void test1(){
  16. Map<String,String[]> map=new HashMap<>();
  17. map.put("uid",new String[]{"u007"});
  18. map.put("username",new String[]{"王嘉尔","王一博"});
  19. map.put("password",new String[]{"123"});
  20. //数据填充--用到了泛型
  21. User user = MyBeanUtils.populate(User.class, map);
  22. System.out.println(user);
  23. }
  24. }

xml文件

DOM4j工具

image.png

  1. package com.igeek.Dom4j;
  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentException;
  4. import org.dom4j.Element;
  5. import org.dom4j.io.SAXReader;
  6. import org.junit.Test;
  7. import java.util.List;
  8. /**
  9. * @author Lynn
  10. * @create 2020-12-23-10:34
  11. */
  12. public class DOM4jDemo {
  13. //测试DOM4j解析
  14. @Test
  15. public void testParse() throws DocumentException {
  16. //1.获取核心类--import org.dom4j.io.SAXReader;
  17. SAXReader saxReader=new SAXReader();
  18. //2.获取整个xml文档--import org.dom4j.Document;
  19. Document document= saxReader.read("beans.xml");
  20. //3.获取所有beans--import org.dom4j.DocumentException;
  21. Element rootElement= document.getRootElement();
  22. //4.获取所有的子节点
  23. List<Element> allBeanElement = rootElement.elements("bean");
  24. //遍历集合
  25. for (Element beanEle:allBeanElement){
  26. //根据自己设定的属性进行解析--bean
  27. String id=beanEle.attributeValue("id");
  28. String className=beanEle.attributeValue("className");
  29. System.out.println("bean的属性:"+id+","+className);
  30. //获取子元素的property
  31. List<Element> property = beanEle.elements("property");
  32. for (Element propEle:property){
  33. String name=propEle.attributeValue("name");
  34. String value=propEle.attributeValue("value");
  35. System.out.println("property的属性:"+name+","+value);
  36. }
  37. }
  38. // System.out.println();//换行
  39. }
  40. }

综合案例1—工厂模式

image.png
image.png
image.png

  1. package com.igeek.Dom4j_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-23-11:23
  5. */
  6. import java.util.Properties;
  7. /**
  8. * javaBean的配置对象
  9. *
  10. * BeanConfig文件用于将对应的xml的配置项,解析封装到对象中
  11. * 属性:id,className,property
  12. *
  13. * 当前这个实体类的实例化beans.xml文件,相当于是一个属性配置的中转站
  14. * 后面进行的操作都是通过中转站处理的
  15. */
  16. public class BeanConfig {
  17. private String id;
  18. private String className;
  19. //用于解析当前的这个bean中的所有的属性,所以直接创建一个properties的对象
  20. private Properties props=new Properties();
  21. public BeanConfig(){
  22. }
  23. public BeanConfig(String id, String className, Properties props) {
  24. this.id = id;
  25. this.className = className;
  26. this.props = props;
  27. }
  28. public String getId() {
  29. return id;
  30. }
  31. public void setId(String id) {
  32. this.id = id;
  33. }
  34. public String getClassName() {
  35. return className;
  36. }
  37. public void setClassName(String className) {
  38. this.className = className;
  39. }
  40. public Properties getProps() {
  41. return props;
  42. }
  43. public void setProps(Properties props) {
  44. this.props = props;
  45. }
  46. @Override
  47. public String toString() {
  48. return "BeanConfig{" +
  49. "id='" + id + '\'' +
  50. ", className='" + className + '\'' +
  51. ", props=" + props +
  52. '}';
  53. }
  54. }
  1. package com.igeek.Dom4j_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-23-14:00
  5. */
  6. import org.apache.commons.beanutils.BeanUtils;
  7. import org.dom4j.Document;
  8. import org.dom4j.Element;
  9. import org.dom4j.io.SAXReader;
  10. import org.junit.Test;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. /**
  15. * 设计模式:23种,常用的有:
  16. * 单例模式,工厂模式,代理模式,模板模式...
  17. *
  18. * 工厂模式:
  19. */
  20. public class BeanFactory {
  21. //1.提供map存放beans.xml中的配置文件内容,使用map,建议使用静态处理--好处是只要加载一次
  22. private static Map<String,BeanConfig> cache=new HashMap<>();
  23. //静态块进行处理数据添加--直接使用静态块一次性加载
  24. static {
  25. try {
  26. //
  27. SAXReader saxReader = new SAXReader();
  28. Document document = saxReader.read("beans.xml");
  29. //获取根元素
  30. Element rootElement = document.getRootElement();
  31. //获取所有的bean元素,当前子元素不止一个,使用list
  32. List<Element> allBeanElement = rootElement.elements("bean");
  33. //遍历集合
  34. for (Element beanEle : allBeanElement) {
  35. //外层的bean的属性
  36. String id = beanEle.attributeValue("id");
  37. String className = beanEle.attributeValue("className");
  38. //创建BeanConfig,并且封装id和className
  39. BeanConfig beanConfig = new BeanConfig();
  40. beanConfig.setId(id);
  41. beanConfig.setClassName(className);
  42. //获取子标签property
  43. List<Element> allPropertyElement = beanEle.elements("property");
  44. for (Element propEle : allPropertyElement) {
  45. String name = propEle.attributeValue("name");
  46. String value = propEle.attributeValue("value");
  47. //将name和value保存到BeanConfig中--先拿到property
  48. beanConfig.getProps().setProperty(name, value);
  49. }//内层for循环
  50. //将封装好的数据保存到map集合
  51. cache.put(id, beanConfig);
  52. }//外层for循环--end
  53. System.out.println("初始化数据:" + cache);
  54. } catch (Exception e) {
  55. throw new RuntimeException(e);
  56. }
  57. }
  58. //
  59. public static Object getBean(String beanId){
  60. BeanConfig beanConfig=cache.get(beanId);
  61. //判断这个对象是否合法
  62. if (beanConfig==null){
  63. throw new RuntimeException("获得的对象["+beanId+"]不存在");
  64. }
  65. //如果存在--通过反射机制进行获取
  66. try {
  67. String className = beanConfig.getClassName();
  68. Class clazz=Class.forName(className);
  69. //获取实例对象
  70. Object obj = clazz.newInstance();
  71. //循环解析--BeanUtils
  72. //stringPropertyNames()方法是Properties的api中提供的,
  73. // 作用是获取到属性名字的字符串类型
  74. for (String name:beanConfig.getProps().stringPropertyNames()){
  75. //每遍历到一个name,就返回name对应的value
  76. String value=beanConfig.getProps().getProperty(name);
  77. //使用BeanUtils封装数据
  78. BeanUtils.setProperty(obj,name,value);
  79. }
  80. return obj;
  81. }catch(Exception e){
  82. throw new RuntimeException(e);
  83. }
  84. }
  85. }
  1. package com.igeek.Dom4j_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-23-14:39
  5. */
  6. import org.junit.Test;
  7. /**
  8. * 测试类
  9. */
  10. public class XMLTEst {
  11. @Test
  12. public void test(){
  13. //通过实例化数据的方法获取
  14. User user=(User)BeanFactory.getBean("userId01");
  15. System.out.println(user);
  16. Book book=(Book) BeanFactory.getBean("book02");
  17. System.out.println(book);
  18. }
  19. }

类加载器

演示类加载器的使用