- 浏览: 185813 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
netwelfare:
这篇文章关于jsessionid讲解的不错。关于jsessio ...
关于JSessionID【转】 -
ITcms:
Activity直接执行了onCreate方法的那部分,我觉得 ...
Android之Activity学习 -
tinygroup:
Sorry发错了。
蛇形矩阵的java实现 -
tinygroup:
public static int[][] spira ...
蛇形矩阵的java实现 -
laitao:
[*]引用pulic djs
Servlet的生命周期
JAVA反射机制的简单应用(1)
Spring中的IOC(控制翻转,又叫依赖注入)
先来看一个例子,A对象关联B对象,学过UML的都知道这是指A类中有一个B类的成员变量,那么我们在创建A对象时,可以用构造函数或者set方法将B类对象与A类对象关联在一起,这种A与B之间的关系需要我们在代码中表现出来,我们也可以把这些代码叫做 硬编码 。
那么依赖注入所要解决的问题便是将这两个对象之间的关联关系的设置过程交给一个配置文件去维护,配置文件中指明了我们要将哪个B对象注入到A对象当中,这里涉及到工厂模式,需要有一个工厂对象,这个对象读取配置文件,根据配置文件的设置来完成B对象的创建以及属性注入的功能,这样当改变两个对象间的关系时,只需要改变配置文件即可,这样就摆脱了依赖注入的局限。
下面实现一个简单的反射应用,从xml文件中读取配置信息,利用反射创建 Employee,Address 实例并将Address实例与Employee实例关联在一起,这一切全是由BeanFactory类完成的,我们不会在类中写上 以下硬编码 ,
Employee e = new Employee();
Address addr = new Address();
...
e.setAddr(addr);
而是由BeanFactory类根据配置文件bean.xml中的配置信息自动实现和上述代码同样的功能,很多框架底层也是这样来实现的。
<?xml version="1.0" ?> <beans> <bean id="b01" class="edu.zhutong.reflection.application.Employee"> <property name="name" value="zhutong"></property> <property name="age" value="24"></property> <property name="salary" value="7000.53"></property> <property name="addr" ref="b03"></property> </bean> <bean id="b02" class="edu.zhutong.reflection.application.Address"> <property name="street" value="PingLeYuan"></property> <property name="no" value="No100"></property> </bean> <bean id="b03" class="edu.zhutong.reflection.application.Address"> <property name="street" value="SongYuDongLi"></property> <property name="no" value="No23"></property> </bean> </beans>
public class Employee { private String name; private int age; private double salary; private Address addr; public Employee() { super(); } public Address getAddr() { return addr; } public void setAddr(Address addr) { this.addr = addr; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public String toString(){ return "Employee name="+name+" age="+age+" salary="+salary+" address="+addr; } }
public class Address { private String street; private String no; public Address() { super(); } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String toString(){ return street+" No"+no; } }
public class BeanFactory { private Map<String,Element> map=new HashMap<String,Element>(); //在构造方法中载入xml文件,将Element对象以id为key放入Map public BeanFactory(){ try { DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); DocumentBuilder db=dbf.newDocumentBuilder(); Document doc=db.parse("beans.xml"); NodeList nl=doc.getElementsByTagName("bean"); for(int i=0;i<nl.getLength();i++){ Element e=(Element)nl.item(i); String id=e.getAttribute("id"); map.put(id, e); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public Object getBean(String id){ try { //分析class属性 利用反射创建对象 Element ele=map.get(id); String className=ele.getAttribute("class"); Class c=Class.forName(className); Object result=c.newInstance(); //逐个为result对象设置属性 NodeList children=ele.getElementsByTagName("property"); for(int i=0;i<children.getLength();i++){ Element child=(Element)children.item(i); //获得属性名 String fieldName=child.getAttribute("name"); String value=child.getAttribute("value"); String ref=child.getAttribute("ref"); //获得属性类型 Field f=c.getDeclaredField(fieldName); Class type=f.getType(); //获得设置属性的方法名 char[] cs=fieldName.toCharArray(); cs[0]-=32; String methodName=new String(cs); methodName="set"+methodName; //利用反射,调用setXXX方法,设置属性值 Method m=c.getDeclaredMethod(methodName, type); Object o=value; if (value.equals("")){ o=getBean(ref); } else{ String valueClassName=type.getSimpleName(); if (valueClassName.equals("int")) o=new Integer(value); if (valueClassName.equals("double")) o=new Double(value); } m.invoke(result, o); } return result; } catch (Exception e) { e.printStackTrace(); return null; } } }
name= zhutong age= 24 height= 7000.53 street= SongYuDongLi no=No23
发表评论
-
Java序列化机制和原理【转】
2011-05-18 09:14 1075序列化的必要性 Java中,一切都是对象,在分布式环境中经 ... -
JAVA反射机制的应用(2)
2010-12-07 16:28 1184JAVA反射机制的应用(2 ... -
java反射学习笔记
2010-12-05 10:21 1515java反射作用: 1、自省:通过对象自身获得类结构,继 ... -
Java反射笔记(2)
2010-12-02 09:46 1683java.lang.array提供了动态 ... -
Java反射笔记(1)
2010-12-01 10:54 1094感谢张龙老师的视频:http://www.verycd.com ... -
连接池的基本工作原理及简单实现
2010-11-24 21:25 868连接池的基本工 ... -
Java 继承与组合的区别
2010-11-22 10:36 7936根据网络上大家对 ... -
蛇形矩阵的java实现
2010-11-10 22:22 7805题目: 计算并输出 nXn ... -
两个矩阵的乘积的java实现
2010-11-10 16:23 8288题目: 计算两个矩阵 A、B 的乘积矩阵 C。 ... -
螺旋数组的java实现
2010-11-10 15:26 2043螺旋数组 要求:存储和输出nXm的螺旋数组,其中n和m为 ... -
统计一个整数中出现次数最多最大的数字
2010-11-10 09:31 6493要求: 统计一个整数中出现最多的数字。如果数字个数 ... -
“百元买百鸡问题”之一重循环实现
2010-11-09 10:06 3667问题描述: 每只母鸡 3 元,每只公鸡 4 元,每只小鸡 0 ... -
[转]欧几里得算法(辗转相除法)求最大公约数
2010-11-08 22:52 2812欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 ... -
[转]深入理解自增自减运算符a=a++和a=++a
2010-11-07 23:04 3181更深入地理解自增自减运算符 首先贴一个非常简洁却 ... -
[转]java中char,byte,short的移位操作
2010-11-07 22:38 4704在Think in Java中有这么一段话“对c ... -
笔试题之以单词为最小单位翻转字符串
2010-11-06 15:39 2346最近做了几个公司 ... -
java解惑之无穷大和NaN
2010-11-01 10:12 17421、i == i + 1 一个数字永远不会等于它自己加1 ... -
java 死锁及解决
2010-10-31 21:28 1093Java线程死锁如何避免 ... -
深入Java关键字null
2010-10-31 14:20 803深入Java关键字null ... -
对java中equals和hashCode函数的一些理解2(转)
2010-10-31 11:24 1021一致性 即如果两个对象相等的话,那么它们必须始终保持相等,除非 ...
相关推荐
JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用
描述JAVA反射机制应用、举例。描述反射机制的具体实现及方法实现。
java反射机制应用,文档中列举了使用java反射机制的各个应用场景,加以代码实例,使用学习非常方便。
JAVA反射机制及应用例子.。。Reflection API
Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源...
java反射机制详解与应用
关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制
java的反射机制的应用实例,对反射的机制很好的理解!
Java反射机制经典案例
java反射机制的原理及在Android下的简单应用
Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf
第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第1页。 3.1 应用...
java反射机制详解与应用.pdf
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
介绍反射的基本原理和实现,以及所涉及到的类和方法,应用的场景
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。...
应用java反射机制打印一个对象.docx
Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件 之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内 部信息,而不是...
反射实例-JAVA反射机制,基本知识介绍和简单的应用
图解java反射机制及常用应用场景_字母哥博客