- 浏览: 45530 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
youjianbo_han_87:
没有说明,如何处理半包啊。解码的时候,判断解码是否成功?不成功 ...
Java网络编程(五)socket的半包,粘包与分包的问题 -
bin_1715575332:
好文章,为何没人顶?
Java网络编程(一) TCP/IP,http,socket,长连接,短连接
定义
反射平时只管拿来用用,真的要给其下个定义,我还真总结不好,不过之前到看到一个比较好的定义:反射就是把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
这个拦截器是我们经常要用到的,主要是用于将前台的参数封装到我们的bean里面。
在配置文件中指定好我们的Bean=”boKe.reflect.struts.Person”,要求Bean提供一个无参的构造函数,并且给属性提供set方法。
实例2:Spring
Spring中运用反射帮助我们处理的依赖注入的问题(包括XML形式和注解的形式)
反射平时只管拿来用用,真的要给其下个定义,我还真总结不好,不过之前到看到一个比较好的定义:反射就是把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位操作和逻辑操作
2012-05-22 21:41 11411.java的位运算符 /** * 计算机对有符号数( ... -
common-logging+log4j日志应用
2012-04-27 17:59 12241. Apache通用日志接口(com ... -
Ant打包Java Project
2012-04-27 16:57 1644最近做了一个服务器端项目,要把一个Java Project打成 ... -
myeclipse7.5 以上插件安装
2011-04-28 11:47 146今天把自己的myeclipse从原来的6.5升级到了7.5,因 ... -
优化Eclipse
2011-04-28 10:33 471、老是弹出Quick update er ... -
关于lucene的框架compass与各类开源框架的整合
2011-04-27 19:19 92关于lucene的框架compass与各类开源框架的整合,实现 ... -
一个简单的关于java应用的JDBC和池连接
2011-01-30 09:25 102/* * This software is release ... -
关于Properties文件的读写
2011-01-30 09:03 106package com.zh.jdbc; import ... -
面向接口编程和面向对象编程是什么关系
2010-12-16 13:48 1651.面向接口编程和面向对象编程是什么关系 首先,面向接口编程 ... -
包含包的编译
2010-12-13 09:52 811.当类没有包时dos下 javac Test ...
相关推荐
代码主要实现了Java反射应用实例, 包含利用反射方法创建对象(使用默认构造函数和自定义构造函数),访问对应对象的方法(包括带参数的和不带参数的),访问对应对象的域(Field). 从这里可以看到代码的详细解说:...
在标题“Java反射应用实例”中,我们关注的是如何在实际项目中利用反射来实现特定的功能。这篇博客文章(可以通过链接访问)可能会探讨以下几个方面: 1. **什么是反射**:首先,我们需要理解反射的基本概念。反射...
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
在深入理解Java反射的应用之前,我们首先需要知道什么是反射以及它的基本概念。 Java反射机制的核心在于`java.lang.Class`类,每个类在内存中都有一个对应的Class对象,它包含了该类的所有信息。通过`Class.forName...
几个小demo,介绍了反射的几个api操作,最后写了一个简单的Java反射应用:工厂+反射+配置文件。
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...
JAVA反射机制及应用例子.。。Reflection API
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。 下面开始正文。 【案例1】通过一个对象...
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
- **运行时装配**:Java反射允许程序在运行时动态地加载类和创建对象,这对于构建可扩展的应用程序非常有用。 - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**...
通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许程序在运行时获取类的信息,这使得Java具有了一定程度上的动态性。具体来说,Java反射机制...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
本实例将深入探讨Java反射的应用及其重要性。 一、什么是Java反射 Java反射机制允许我们动态地获取类的信息,并在运行时创建和调用对象的方法。这种能力使得Java具有高度的灵活性和动态性,特别是在处理跨版本兼容...
### Java反射应用案例 1. **动态代理**:Java反射可以用来实现动态代理模式,其中最典型的应用是在JDK动态代理和CGLIB动态代理中。这两种技术都依赖于反射来生成代理类和调用目标方法。 2. **框架中的应用**:许多...