java 反射练习 设计一个小工具,实现给一组字符串,创建一个对象

|--目的

设计一个小工具,实现给一组字符串,创建一个对象

|--思路

采用反射的方式,获得一个类的属性,通过属性名拼接字符串,获取所有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 }
MySpring--里面写小工具的类
 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 }
Preson--用于测试的实体类
 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 }
Question--用于测试的实体类
 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 }
测试入口

|--运行结果





猜你喜欢

转载自www.cnblogs.com/twuxian/p/11622820.html