`
xifangyuhui
  • 浏览: 188988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA反射机制的简单应用(1)

阅读更多

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
 

 

0
1
分享到:
评论

相关推荐

    JAVA反射机制应用

    JAVA反射机制应用 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反射机制及应用例子

    JAVA反射机制及应用例子.。。Reflection API

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。

    java反射机制应用

    ### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    Java反射机制 Java反射机制

    #### 三、Java反射机制的核心概念与应用 1. **核心概念** - **Class对象**:每个加载到Java虚拟机中的类都会对应一个Class对象,该对象包含了类的完整信息。 - **Method对象**:表示类中的方法,通过它可以获取...

    java反射机制详解与应用.pdf

    Java 反射机制详解与应用 Java 反射机制是一种非常强大的动态相关机制,允许 Java 程序在运行时加载、探知、使用编译期间完全未知的类别。这种机制允许程序在运行时透过 Reflection APIs 取得任何一个已知名称的...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    java反射机制简单理解

    Java 反射机制的主要应用场景有两种:一种是 Java 反射机制在 Java 语言内部的应用,另一种是 Java 反射机制在 Java 本地接口(JNI)中的应用。 在 Java 语言内部,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反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都...以上是关于Java反射机制的基本概念、用法和示例解析,希望能帮助你更好地理解和应用这一重要的Java特性。

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至...对于初学者而言,了解并掌握Java反射机制的基本原理和应用场景是非常有益的。

    java反射机制详解与应用

    本文将深入探讨Java反射机制的原理、应用以及如何使用反射API。 首先,让我们了解如何生成Class对象,这是反射操作的基础。Class对象代表了Java中的类,可以通过以下四种方式获取: 1. 使用`getClass()`方法:每个...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java反射机制讲解与应用举例

    关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

Global site tag (gtag.js) - Google Analytics