反射加内省解决耦合问题
1 package com.gh.introspector; 2 /** 3 * JavaBean 4 * @author ganhang 5 * 6 */ 7 public class Dog { 8 private String name; 9 private int age; 10 public String getName() { 11 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public int getAge() { 18 return age; 19 } 20 public void setAge(int age) { 21 this.age = age; 22 } 23 @Override 24 public String toString() { 25 return "Dog [name=" + name + ", age=" + age + "]"; 26 } 27 28 }
1 package com.gh.introspector; 2 3 import java.beans.BeanInfo; 4 import java.beans.Introspector; 5 import java.beans.PropertyDescriptor; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.lang.reflect.Method; 9 import java.util.Properties; 10 11 /** 12 * 工厂类 13 * @author ganhang 14 * 15 */ 16 public class DogFactory { 17 //属性文件操作工具类 18 private static Properties config = new Properties(); 19 static { 20 // 读取属性文件到输入流 21 InputStream is = Thread.currentThread() 22 .getContextClassLoader().getResourceAsStream("bean.properties"); 23 //注意:配置文件放src下可以不用写包名,如果放包里面则要写包名,否者下面报空指针 24 try { 25 // 加载输入流 26 config.load(is); 27 is.close(); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 } 32 // 同样不想与Dog耦合,直接依赖,所以用配置文件创建dog 33 public static Dog getDog(String name) { 34 35 // 根据key获取values 36 String classname = config.getProperty(name); 37 try { 38 // 根据类全名获取类信息Class对象 39 Class dogClass = Class.forName(classname); 40 // 实例化对象 41 Dog dog = (Dog) dogClass.newInstance(); 42 // 内省:获取bean信息 43 BeanInfo beanInfo = Introspector.getBeanInfo(dogClass); 44 // 通过bean信息获得所有属性描述器(数组) 45 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); 46 // 循环遍历属性描述器 47 for (PropertyDescriptor pd : pds) { 48 if ("name".equals(pd.getName())) { 49 String nameValue = config.getProperty("dog.name"); 50 // 通过属性描述器获得改属性上的写操作方法(set方法) 51 Method method = pd.getWriteMethod(); 52 // 在dog对象上调用方法 53 method.invoke(dog, nameValue); 54 } else if ("age".equals(pd.getName())) { 55 String ageValue = config.getProperty("dog.age"); 56 // 通过属性描述器获得改属性上的写操作方法(set方法) 57 Method method = pd.getWriteMethod(); 58 // 在dog对象上调用方法,注意String转int 59 method.invoke(dog, Integer.parseInt(ageValue)); 60 } 61 } 62 return dog; 63 } catch (Exception e) { 64 e.printStackTrace(); 65 } 66 return null; 67 } 68 }
配置文件bean.properties
#\u914D\u7F6EJavaBean\u7684\u5168\u540D
dog=com.gh.introspector.Dog
dog.name=\u5C0F\u767D
dog.age=3
时间: 2024-10-13 02:07:51