- 浏览: 188547 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1120序列化的必要性 Java中,一切都是对象,在分布式环境中经 ... -
JAVA反射机制的应用(2)
2010-12-07 16:28 1232JAVA反射机制的应用(2 ... -
java反射学习笔记
2010-12-05 10:21 1555java反射作用: 1、自省:通过对象自身获得类结构,继 ... -
Java反射笔记(2)
2010-12-02 09:46 1724java.lang.array提供了动态 ... -
Java反射笔记(1)
2010-12-01 10:54 1135感谢张龙老师的视频:http://www.verycd.com ... -
连接池的基本工作原理及简单实现
2010-11-24 21:25 913连接池的基本工 ... -
Java 继承与组合的区别
2010-11-22 10:36 7985根据网络上大家对 ... -
蛇形矩阵的java实现
2010-11-10 22:22 7868题目: 计算并输出 nXn ... -
两个矩阵的乘积的java实现
2010-11-10 16:23 8330题目: 计算两个矩阵 A、B 的乘积矩阵 C。 ... -
螺旋数组的java实现
2010-11-10 15:26 2091螺旋数组 要求:存储和输出nXm的螺旋数组,其中n和m为 ... -
统计一个整数中出现次数最多最大的数字
2010-11-10 09:31 6539要求: 统计一个整数中出现最多的数字。如果数字个数 ... -
“百元买百鸡问题”之一重循环实现
2010-11-09 10:06 3706问题描述: 每只母鸡 3 元,每只公鸡 4 元,每只小鸡 0 ... -
[转]欧几里得算法(辗转相除法)求最大公约数
2010-11-08 22:52 2867欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 ... -
[转]深入理解自增自减运算符a=a++和a=++a
2010-11-07 23:04 3227更深入地理解自增自减运算符 首先贴一个非常简洁却 ... -
[转]java中char,byte,short的移位操作
2010-11-07 22:38 4738在Think in Java中有这么一段话“对c ... -
笔试题之以单词为最小单位翻转字符串
2010-11-06 15:39 2390最近做了几个公司 ... -
java解惑之无穷大和NaN
2010-11-01 10:12 17801、i == i + 1 一个数字永远不会等于它自己加1 ... -
java 死锁及解决
2010-10-31 21:28 1122Java线程死锁如何避免 ... -
深入Java关键字null
2010-10-31 14:20 835深入Java关键字null ... -
对java中equals和hashCode函数的一些理解2(转)
2010-10-31 11:24 1048一致性 即如果两个对象相等的话,那么它们必须始终保持相等,除非 ...
相关推荐
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
下面通过一个简单的示例展示如何使用Java反射机制: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionDemo { public ...
JAVA反射机制及应用例子.。。Reflection API
### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。
### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
#### 三、Java反射机制的核心概念与应用 1. **核心概念** - **Class对象**:每个加载到Java虚拟机中的类都会对应一个Class对象,该对象包含了类的完整信息。 - **Method对象**:表示类中的方法,通过它可以获取...
Java 反射机制详解与应用 Java 反射机制是一种非常强大的动态相关机制,允许 Java 程序在运行时加载、探知、使用编译期间完全未知的类别。这种机制允许程序在运行时透过 Reflection APIs 取得任何一个已知名称的...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
Java 反射机制的主要应用场景有两种:一种是 Java 反射机制在 Java 语言内部的应用,另一种是 Java 反射机制在 Java 本地接口(JNI)中的应用。 在 Java 语言内部,Java 反射机制可以用来动态地加载类、创建对象、...
下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都...以上是关于Java反射机制的基本概念、用法和示例解析,希望能帮助你更好地理解和应用这一重要的Java特性。
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至...对于初学者而言,了解并掌握Java反射机制的基本原理和应用场景是非常有益的。
本文将深入探讨Java反射机制的原理、应用以及如何使用反射API。 首先,让我们了解如何生成Class对象,这是反射操作的基础。Class对象代表了Java中的类,可以通过以下四种方式获取: 1. 使用`getClass()`方法:每个...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...