简单的反射框架应用

来源:互联网 发布:淘宝详情页关联怎么做 编辑:程序博客网 时间:2024/06/07 01:18

  通过以上几篇文章,已经知道反射是什么,大概是怎么用,接下来用反射做一个简单的实例模拟框架运行原理


配置文件config.xml的代码如下

<?xml version="1.0" encoding="UTF-8"?> <beans>     <bean id="javaBean" class="javatribe.fts.reflection.JavaBean">        <property name="userName">            <value>冯先生</value>        </property>        <property name="password">            <value>88888888</value>        </property>     </bean> </beans> 
然后建立一个JavaBean

package javatribe.fts.reflection;public class JavaBean {private String userName;     private String password;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;} }

接下来建立一个BeanFactory这是bean工厂,学习过Spring框架大体都会有所了解的了

package javatribe.fts.reflection;import java.io.InputStream; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader;public class BeanFactory {     private Map<String, Object> beanMap = new HashMap<String, Object>();     /**     * bean工厂的初始化.     * @param xml xml配置文件     */     public void init(String xml) {            try {                   //读取指定的配置文件                   SAXReader reader = new SAXReader();                   ClassLoader classLoader = Thread.currentThread().getContextClassLoader();                   //从class目录下获取指定的xml文件                   InputStream ins = classLoader.getResourceAsStream(xml);                   Document doc = reader.read(ins);                   Element root = doc.getRootElement();                     Element foo;                                     //遍历bean                   for (Iterator i = root.elementIterator("bean"); i.hasNext();) {                            foo = (Element) i.next();                          //获取bean的属性id和class                          Attribute id = foo.attribute("id");                            Attribute cls = foo.attribute("class");                                                   //利用Java反射机制,通过class的名称获取Class对象                          Class bean = Class.forName(cls.getText());                                                   //获取对应class的信息                          java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);                          //获取其属性描述                          java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();                          //设置值的方法                          Method mSet = null;                          //创建一个对象                          Object obj = bean.newInstance();                                                   //遍历该bean的property属性                          for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {                                   Element foo2 = (Element) ite.next();                                 //获取该property的name属性                                 Attribute name = foo2.attribute("name");                                 String value = null;                                                                 //获取该property的子元素value的值                                 for(Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) {                                        Element node = (Element) ite1.next();                                        value = node.getText();                                        break;                                 }                                                                 for (int k = 0; k < pd.length; k++) {                                        if (pd[k].getName().equalsIgnoreCase(name.getText())) {                                               mSet = pd[k].getWriteMethod();                                               //利用Java的反射极致调用对象的某个set方法,并将值设置进去                                               mSet.invoke(obj, value);                                        }                                 }                          }                                                   //将对象放入beanMap中,其中key为id值,value为对象                          beanMap.put(id.getText(), obj);                   }            } catch (Exception e) {                   System.out.println(e.toString());            }     }         /**     * 通过bean的id获取bean的对象.     * @param beanName bean的id     * @return 返回对应对象     */     public Object getBean(String beanName) {            Object obj = beanMap.get(beanName);            return obj;     }         /**     * 测试方法.     * @param args     */     public static void main(String[] args) {            BeanFactory factory = new BeanFactory();            factory.init("config.xml");            JavaBean javaBean = (JavaBean) factory.getBean("javaBean");            System.out.println("userName=" + javaBean.getUserName());            System.out.println("password=" + javaBean.getPassword());     } } 

最后输出结果是

userName=冯先生password=888888




0 0
原创粉丝点击