简单的反射框架应用
来源:互联网 发布:淘宝详情页关联怎么做 编辑:程序博客网 时间: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
- 简单的反射框架应用
- 反射的简单应用
- 反射简单的应用
- 反射的简单应用
- 反射的简单应用
- 框架原理反射的应用
- java反射的简单应用
- java反射的简单应用
- 反射的简单应用2
- 反射的简单应用三
- Java反射的简单应用
- java反射的简单应用
- 反射:Class类、反射概念、类中各成员的反射、反射的应用、数组的反射、框架
- 反射的应用---实习框架功能
- struts2框架是如何应用反射的
- C#反射的Assembly的简单应用
- C#反射的Assembly的简单应用
- C#反射的Assembly的简单应用
- 傅立叶变化matlab实验,从逗比到略懂
- Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
- 暑期个人赛--第十场--A
- 04-3. 统计素数并求和(20)
- uva 11249 - Game(组合游戏)
- 简单的反射框架应用
- python核心编程
- 暑期个人赛--第九场--A
- [数据库]oracle(2)-alter table ,调皮的属性列 --- 万万没想到 系列(1)
- 最快速的Android开发环境搭建ADT-Bundle及Hello World
- 多线程----条件变量
- python字符串总结
- 链表的倒置
- JavaScript学习 jquery学习11 ajax开发