|--目的
设计一个小工具,实现给一组字符串,创建一个对象
|--思路
采用反射的方式,获得一个类的属性,通过属性名拼接字符串,获取所有setter方法,并未这些方法赋值
|--代码
1 package com.ioc; 2 3 4 import java.lang.reflect.Constructor; 5 import java.lang.reflect.Field; 6 import java.lang.reflect.Method; 7 import java.util.Scanner; 8 9 /** 10 * @auther::9527 11 * @Description: 设计一个小工具,实现给一组字符串,创建一个对象 12 * @program: Inversion Of Control 对象的控制反转 13 * @create: 2019-10-04 17:18 14 */ 15 public class MySpring { 16 17 18 /** 19 * 设计一个方法, 控制对象的创建 20 * @param className String的类全名 21 * @return 返回对象Object 22 * Dependency Injection 对象的控制权是别人的,别人创建对象的同时,帮我们自动注入属性值 23 */ 24 public Object getBean(String className) { 25 Object obj = null; 26 Scanner input = new Scanner(System.in); 27 try { 28 //获取方法传递进来的参数对应的类 29 Class clazz = Class.forName(className); 30 //通过clazz创建一个对象 31 obj = clazz.newInstance(); 32 //在这里做一个自动的依赖注入(DI) 对象中的所有属性值都赋值 33 //找到每个不同对象中的所有set方法,给属性赋值 34 //思路:自己通过拼接字符串的方式处理 35 //1、通过clazz 找到本类中所有属性==>>获取每一个属性的名字==>>set属性 36 Field[] fields = clazz.getDeclaredFields(); 37 for (Field field : fields) { 38 //获取属性名 39 String fieldName = field.getName(); 40 //手动拼接字符串 拼接属性对应的set方法名 41 //首字母大写 42 String firstLetter = fieldName.substring(0, 1).toUpperCase(); 43 //除了首字母之外的其他字母 44 String otherLetter = fieldName.substring(1); 45 StringBuilder setMethodName =new StringBuilder("set"); 46 setMethodName.append(firstLetter); 47 setMethodName.append(otherLetter); 48 //获取field对应的属性类型-->>寻找set方法时候传递参数用 49 Class fieldType = field.getType(); 50 //通过处理好的字符串,找方法名 51 Method setMethod = clazz.getMethod(setMethodName.toString(),fieldType); 52 //要求赋值 53 System.out.println("请给"+fieldName+"属性提供值"); 54 String value = input.nextLine(); 55 //属性的值通过Scanner 文件内读取全都是String类型 56 //执行set方法的时候,方法需要的值不一定都是String类型,所以要将String类型的值转化为属性类型的值 57 //除char以外,可以利用包装类带String的构造方法处理 58 Constructor con = fieldType.getConstructor(String.class);//属性对应的构造方法 59 60 //执行方法 61 setMethod.invoke(obj,con.newInstance(value)); 62 } 63 64 65 } catch (Exception e) { 66 e.printStackTrace(); 67 } 68 return obj; 69 } 70 71 }
1 package com.ioc; 2 3 /** 4 * @auther::9527 5 * @Description: 测试反射 6 * @program: jstl2 7 * @create: 2019-10-04 18:13 8 */ 9 public class Preson { 10 private Integer age; 11 private String name; 12 private String sex; 13 14 public Preson() { 15 } 16 17 public Preson(Integer age, String name, String sex) { 18 this.age = age; 19 this.name = name; 20 this.sex = sex; 21 } 22 23 @Override 24 public String toString() { 25 return "Preson{" + 26 "age=" + age + 27 ", name='" + name + '\'' + 28 ", sex='" + sex + '\'' + 29 '}'; 30 } 31 32 public Integer getAge() { 33 return age; 34 } 35 36 public void setAge(Integer age) { 37 this.age = age; 38 } 39 40 public String getName() { 41 return name; 42 } 43 44 public void setName(String name) { 45 this.name = name; 46 } 47 48 public String getSex() { 49 return sex; 50 } 51 52 public void setSex(String sex) { 53 this.sex = sex; 54 } 55 }
1 package com.ioc; 2 3 /** 4 * @auther::9527 5 * @Description: 实现控制反转的javaBean 6 * @program: jstl2 7 * @create: 2019-10-04 17:27 8 */ 9 public class Question { 10 private String title; 11 private String answer; 12 13 public Question() { 14 } 15 16 public Question(String title, String answer) { 17 this.title = title; 18 this.answer = answer; 19 } 20 21 public String getTitle() { 22 return title; 23 } 24 25 public void setTitle(String title) { 26 this.title = title; 27 } 28 29 public String getAnswer() { 30 return answer; 31 } 32 33 public void setAnswer(String answer) { 34 this.answer = answer; 35 } 36 37 @Override 38 public String toString() { 39 return "Question{" + 40 "title='" + title + '\'' + 41 ", answer='" + answer + '\'' + 42 '}'; 43 } 44 }
1 package com.ioc; 2 3 /** 4 * @auther::9527 5 * @Description: 6 * @program: jstl2 7 * @create: 2019-10-04 17:29 8 */ 9 public class TestMain { 10 public static void main(String[] args) { 11 //创建一个Question对象 将对象的控制权交给MySpring 类处理 就是控制反转 12 //测试一下question 13 MySpring spring = new MySpring(); 14 Question question = (Question) spring.getBean("com.ioc.Question"); 15 System.out.println(question); 16 //测试一下Preson 17 Preson p = (Preson) spring.getBean("com.ioc.Preson"); 18 System.out.println(p); 19 } 20 }
|--运行结果