`
别惹Java
  • 浏览: 45676 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java反射应用

    博客分类:
  • Java
 
阅读更多
定义
反射平时只管拿来用用,真的要给其下个定义,我还真总结不好,不过之前到看到一个比较好的定义:反射就是把java类中的各个成分映射成相应的java类。
谈到类,我们说java中类的概念本身就是为了让我们更好的去模拟现实社会,比如说模拟人,我们会写出Person类;车我们会写出Car类……。那我们有没有想过,这么多我们写出来的类,我们应该用什么类来表示哪?  这样就很容易的引出了Class这个类。

看看两种类型的对比:

普通类(Person,Car) :new 类名();这个时候JVM为对象分配堆内存中。
Class类:Class.forname(“类名”),将编译好的二进制文件存储到方法区中。

更多的我们可以去了解JVM的体系结构<深入java虚拟机>

下面看看如何获取到class对象
1. 通过普通类对象获取 ,例如Date d=new Date();     Class cl=d.getClass();
2. 可以调用静态方法forName()获得类名对应的class对象
   例如:String className="java.util.Date";
Class cl=Class.forName(className);
3.通过普通类获得  例如Class cl=Date.class


有了class这个对象,我们就可以对我们的普通类做任何我们想做的事情了,主要围绕:
Field,Method,Constructor分别用来描述类的域,方法和构造器.
具体细节我们可以参考JDK API

实例1:struts2
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>


这个拦截器是我们经常要用到的,主要是用于将前台的参数封装到我们的bean里面。
在配置文件中指定好我们的Bean=”boKe.reflect.struts.Person”,要求Bean提供一个无参的构造函数,并且给属性提供set方法。
package boKe.reflect.struts;

public class Person {

	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString(){
		return "姓名:"+name+",年龄:"+age;
	}

}

package boKe.reflect.struts;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.ConvertUtils;

public class Main {

	public static void main(String[] args) throws Exception {
		// request,获取的消息都是String类型
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("name", "zhaohui");
		paramMap.put("age", "25");
		// 加载类,实例化对象
		Object person = Class.forName("boKe.reflect.struts.Person").newInstance();
		// 处理参数
		PropertyDescriptor[] ps = Introspector.getBeanInfo(person.getClass())
				.getPropertyDescriptors();
		Object value = null;
		for (PropertyDescriptor propertyDescriptor : ps) {
			Method setter = propertyDescriptor.getWriteMethod();// 获取属性的setter方法
			if (setter != null) {
				value = ConvertUtils.convert(
						paramMap.get(propertyDescriptor.getName()),
						propertyDescriptor.getPropertyType());
				setter.invoke(person, value);
			}
		}
		System.out.println(person.toString());
	}

}



实例2:Spring
Spring中运用反射帮助我们处理的依赖注入的问题(包括XML形式和注解的形式)

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="personDao" class="boKe.reflect.spring.PersonDao"></bean>
    <bean id="personService" class="boKe.reflect.spring.PersonService">
		<property name="personDao" ref="personDao"></property>        
    </bean>
</beans>


package boKe.reflect.spring;

public class PropertyDefinition {
	private String name;
	private String ref;
	private String value;

	public PropertyDefinition(String name, String ref) {
		super();
		this.name = name;
		this.ref = ref;
	}

	public PropertyDefinition(String name, String ref, String value) {
		super();
		this.name = name;
		this.ref = ref;
		this.value = value;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getRef() {
		return ref;
	}

	public void setRef(String ref) {
		this.ref = ref;
	}

}


package boKe.reflect.spring;

import java.util.ArrayList;
import java.util.List;

public class BeanDefinition {
	
	private String id;
	private String className;
	private List<PropertyDefinition> propertys=new ArrayList<PropertyDefinition>();
	
	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}
	public List<PropertyDefinition> getPropertys() {
		return propertys;
	}

	public void setPropertys(List<PropertyDefinition> propertys) {
		this.propertys = propertys;
	}

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}

}


package boKe.reflect.spring;

public class PersonDao {
	
	public String getName(){
		return "zhaohui";
	}

}


package boKe.reflect.spring;

public class PersonService {

	private PersonDao personDao;

	public String getName() {
		return personDao.getName();
	}

	public PersonDao getPersonDao() {
		return personDao;
	}

	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

}


package boKe.reflect.spring;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.ConvertUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class XmlApplicationContext {

	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
	private Map<String, Object> sigletons = new HashMap<String, Object>();

	public XmlApplicationContext(String fileName) {
		readXmlFile(fileName);
		instanceBeans();
		injectObject();
	}

	public Object getBean(String beanName) {
		return this.sigletons.get(beanName);
	}

	/**
	 * 读取xml
	 * 
	 * @param fileName
	 *            文件名
	 */
	private void readXmlFile(String fileName) {
		SAXReader saxReader = new SAXReader();
		Document doucment = null;
		try {
			doucment = saxReader.read(this.getClass().getResourceAsStream(
					fileName));
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		List<Element> beans = doucment.getRootElement().elements();
		for (Element bean : beans) {
			String id = bean.attributeValue("id");
			String clazz = bean.attributeValue("class");
			BeanDefinition beanDefine = new BeanDefinition(id, clazz);
			List<Element> propertys = bean.elements();
			for (Element property : propertys) {
				String propertyName = property.attributeValue("name");
				String propertyRef = property.attributeValue("ref");
				String propertyValue = property.attributeValue("value");
				PropertyDefinition propertyDefinition = new PropertyDefinition(
						propertyName, propertyRef, propertyValue);
				beanDefine.getPropertys().add(propertyDefinition);
			}

			beanDefines.add(beanDefine);
		}
	}

	/***
	 * 完成实例化对象
	 */
	private void instanceBeans() {
		for (BeanDefinition beanDefinition : beanDefines) {
			if (beanDefinition.getClassName() != null
					&& !"".equals(beanDefinition.getClassName().trim())) {
				try {
					sigletons.put(beanDefinition.getId(),
							Class.forName(beanDefinition.getClassName())
									.newInstance());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 为bean对象的属性注入值
	 */
	private void injectObject() {
		for (BeanDefinition beanDefinition : beanDefines) {
			Object bean = sigletons.get(beanDefinition.getId());
			if (bean != null) {
				try {
					// 获取当前对象所有的属性
					PropertyDescriptor[] ps = Introspector.getBeanInfo(
							bean.getClass()).getPropertyDescriptors();
					for (PropertyDefinition propertyDefinition : beanDefinition
							.getPropertys()) {
						for (PropertyDescriptor propertyDescriptor : ps) {
							// 用于比较当前在xml文件中配置的属性是否也在获取的对象的属性中
							if (propertyDefinition.getName().equals(
									propertyDescriptor.getName())) {
								Method setter = propertyDescriptor
										.getWriteMethod();// 获取属性的setter方法
								if (setter != null) {
									Object value = null;
									if (propertyDefinition.getRef() != null
											&& !propertyDefinition.getRef()
													.equals("")) {
										value = sigletons
												.get(propertyDefinition
														.getRef());

									} else {
										// 类型的转换将字符串类型转化为基本类型
										value = ConvertUtils.convert(
												propertyDefinition.getValue(),
												propertyDescriptor
														.getPropertyType());
									}
									// 如果setter方法是private
									setter.setAccessible(true);
									setter.invoke(bean, value);
								}
							}
						}
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}


package boKe.reflect.spring;

public class Main {
	
	public static void main(String[] args) {
		XmlApplicationContext context=new XmlApplicationContext("bean.xml");
		PersonService service=(PersonService) context.getBean("personService");
		System.out.println(service.getName());
	}

}
分享到:
评论

相关推荐

    Java反射应用实例

    代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...

    java反射应用实例

    在标题“Java反射应用实例”中,我们关注的是如何在实际项目中利用反射来实现特定的功能。这篇博客文章(可以通过链接访问)可能会探讨以下几个方面: 1. **什么是反射**:首先,我们需要理解反射的基本概念。反射...

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    java反射应用详细介绍.rar

    在深入理解Java反射的应用之前,我们首先需要知道什么是反射以及它的基本概念。 Java反射机制的核心在于`java.lang.Class`类,每个类在内存中都有一个对应的Class对象,它包含了该类的所有信息。通过`Class.forName...

    java反射应用的原理以及应用

    Java反射是Java语言的一个强大特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于`java.lang.Class`类,它是Java中所有类的通用表示,提供了访问类元数据的能力。 首先,我们要理解`...

    Java反射简单应用

    几个小demo,介绍了反射的几个api操作,最后写了一个简单的Java反射应用:工厂+反射+配置文件。

    JAVA反射机制应用

    JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...

    JAVA 反射机制应用

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

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    java反射机制应用

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

    JAVA反射机制及应用例子

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

    java反射应用详细介绍

    本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。 下面开始正文。 【案例1】通过一个对象...

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    Java反射机制总结

    - **运行时装配**:Java反射允许程序在运行时动态地加载类和创建对象,这对于构建可扩展的应用程序非常有用。 - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**...

    java面试题--反射机制

    通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许程序在运行时获取类的信息,这使得Java具有了一定程度上的动态性。具体来说,Java反射机制...

    java反射-英文版反射规范

    Java反射广泛应用于框架开发、动态代理、测试工具等领域。例如,在Spring框架中,反射被用来动态创建对象和调用方法;在Hibernate等ORM框架中,反射用于处理数据库记录与Java对象之间的映射关系。 #### 三、反射...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射经典实例

    本实例将深入探讨Java反射的应用及其重要性。 一、什么是Java反射 Java反射机制允许我们动态地获取类的信息,并在运行时创建和调用对象的方法。这种能力使得Java具有高度的灵活性和动态性,特别是在处理跨版本兼容...

    java反射视频

    ### Java反射应用案例 1. **动态代理**:Java反射可以用来实现动态代理模式,其中最典型的应用是在JDK动态代理和CGLIB动态代理中。这两种技术都依赖于反射来生成代理类和调用目标方法。 2. **框架中的应用**:许多...

Global site tag (gtag.js) - Google Analytics