`
goalietang
  • 浏览: 25934 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

浅谈Java的反射(五)对JavaBean的其他反射操作

阅读更多
        无论是反射调用对象方法属性,还是利用内省的机制来读取属性描述器从而获得对象属性进行操作,都是Java所提供的一种别样的类型操作方式。但是除了Java本身提供的对对象的内省操作方式外,其他机构在此基础上也封装了一些更便于使用的包来实现这样的操作。我们曾经接触过的很多框架,也正是在这些包提供支持的基础上,再封装出来一系列自己的API的。这些包中,比较经典也是大多数人都接触过的,当然还是Apache公司推出的common系列的包。其中commons-beanutils正式Apache推出的使用便捷方式调用JavaBean的API。让我们看看他的神奇之处吧。
        首先,使用beanutils时,官方也告诉我们他还依赖于另一个包才能使用,就是commons-logging。这个包是Apache公司推出用来日志记录的包。如果没有这个包,运行beanutils相关代码的时候们,会报找不到logFactory的错误。不要问我问什么会依赖,感兴趣的朋友可以到Apache官网上查查。
       当以上两个包都导入到了我们的开发环境中后,我们就可以开始使用beanutils了。使用之前,让我们看看beanutils的官方文档中推荐的几个包。
     
引用
org.apache.commons.beanutils

       这个包是beanutils最主要的包,所有对JavaBean进行内省操作的工具应该都在这个包里面。他是在Java API自己的接口上面进行的扩展,是一套遵循JavaBean命名设计模式的用于辅助属性进行getting和setting操作的底层的实用类。它的动态定义和访问JavaBean属性的机制特别棒。 以上就是Apache官方对beanutils包的介绍(翻译的不好,请见谅)。
     
引用
org.apache.commons.beanutils.converters

        这个包是标准实现Converter借口的,他用于在系统启动的时候预注册ConvertUtils
        这里要解释一下,Apache的beanutils默认支持对基本数据类型的封装转换,但是却不支持对复杂类型的封装转换。举个例子。我们同行在Web页面提交表单或其他数据传输,基本上都是用的String的传入。但是我们后台的javaBean里面,却不止String一种类型的属性。所以JavaBean封装的时候,beanUtils的Converter支持了简单数据类型的彼此转换,当然也支持了String类型转换封装到其他的基本数据类型的属性里。但是如果我们的对象属性有除基本类型外的其他类型,例如Date类,或是其他自定义类型。那么我们就要自己来实现Converter借口,并重写他转换的代码。然后再注册进我们要使用的BeanUtils Converter里面。这样,当我们传入一个String类型的变量,Converter也会将其转换成我们支持的其他复杂类型了。
        当然,除以上两个包外,commons-beanutils里面还有其他的包,大多数也是基于这两个宝上面的,有些实现了本地化的一些操作。还有各种官方已经给我们封装好了的转换器,例如日期转换器,URL转换器,本地float转换器等等。但是很多地方建议使用转换器最好自己去实现,因为Apache推荐的转换器还是存在一些缺陷。而且自己实现也很容易,还可根据自己特殊需求来做。
        接下来,我们通过分析下面的代码来学习一些beanutils包常用的方法。
	public void execute1() throws Exception{
		//通过反射获得一个Animal的对象
		Class clazz = Class.forName("com.ncs.tang.Animal");
		Animal a = (Animal) clazz.newInstance();
		//因为需要字符串自动转日期并封装到JavaBean里
		//这里使用ConvertUtils注册一个Converter,注册的Converter是我们自己实现的。
		//new一个Converter,但是要重写他的convert方法。
		ConvertUtils.register(new Converter() {
			
			public <T> T convert(Class<T> arg0, Object value) {
				if (value == null) {
					return null;
				}
				
				if (!(value instanceof String)) {
					return null;
				}
				String values = (String)value;
				if ("".equals(values.trim())) {
					return null;
				}
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				try {
					return (T) (sdf.parse(values));
				} catch (ParseException e) {
					throw new RuntimeException(e);
				}
			}
		},Date.class);
		//利用BeanUtils提供的setProperty方法,为我们的对象的某个属性设置值。
		//参数1是需要设值的对象,参数2是需要设值的属性,参数3是所设的值。
		BeanUtils.setProperty(a, "name", "golden pig");
		BeanUtils.setProperty(a, "age", 18);
		BeanUtils.setProperty(a, "female", false);
		BeanUtils.setProperty(a, "types", "pig");
		//因为我们自己实现了String转日期,所以这里的日期类属性就能够正常完成自动转换和封装
		BeanUtils.setProperty(a, "brithday", "1982-02-25");
		//打印出每个值,检查是否设置成功。
		System.out.println(a.getName());
		System.out.println(a.getAge());
		System.out.println(a.getTypes());
		System.out.println(a.isFemale());
		System.out.println(a.getBrithday());
	}
	
	@Test
	public void execute2() throws Exception{
        //new 一个map,key就是我们需要设值的属性名,value就是该属性所需要设置的值。
		HashMap map = new HashMap();
		map.put("name", "golden fish");
		map.put("age", "32");
		map.put("female", true);
		map.put("types", "dog");
		map.put("brithday", "1992-12-25");
		
		Animal a = new Animal();
		//使用ConvertUtils来注册一个Converter,这个converter是Aache自己提供给我们的
		//第二个参数当然就是我们需要使用到该Converter的数据类型,这里我们要转换的是日期。
		ConvertUtils.register(new DateLocaleConverter(Locale.CHINA), Date.class);
		//populate方法允许我们为一个对象a简单设值。map就是我们设置的所有值的键值对。
		BeanUtils.populate(a, map);
		
		System.out.println(a.getName());
		System.out.println(a.getAge());
		System.out.println(a.getTypes());
		System.out.println(a.isFemale());
		System.out.println(a.getBrithday());
	}

        补充说明一下。我们常用到的就是beanUtils里面的setProperty方法。用他实现单个属性的赋值。我们也可以一次性批量赋值。当我们前段是使用了一个map来获取一个对象的值。而且map的键就是对象属性的名称,值就是对象属性所需要的赋值。那么我们使用populate方法,就能很轻松的将这个map里面的内容给填充到我们对应的对象里面。
        再来说一下Converter,注册一个Converter使用到的是ConvertUtils里面的register方法。传入的第一个参数是我们需要注册的Converter,第二个参数就是这个Converter所准针对的待转换的类型。以上代码我们分别注册了一个我们自己实现的Converter和Apache带给我们的Converter。但是Apache这个Converter没有非空验证(我们自己设置的有),当遇到输入的日期是空的,他会转换失败而报异常。而我们自己实现的不会报。
        在这里多说一句,其实除了对JavaBean进行操作的BeanUtils包而外,Apache还提供了很多便于我们开发使用的包,虽说有些包也一样有某些缺陷,但是我们可以参考它们实现的原理来封装我们业务上需要的逻辑。喜欢研究的童鞋们,不放到他的官网上看看。实用包真不少,好多都是我们主流框架所依赖的包。
        附件是我上传的当前最新的BeanUtils包和logging包,方便大家测试使用。这两个包里面都有API Doc供大家参考,大家也可以到Apache官方网站上去Download。

        后记: 在家里的JDK1.6,使用BeanUtils只需要dependence一个logging包就行了,但是我在公司使用JDK1.5的时候,发现他还需要依赖一个commons-collections的包,其实在Apache官方网站上,他也说了需要依赖这个包。可能1.6有关于这个包的引用所以不导入也行。可是1.5的JDK如果不导入该包,就会报一个ClassNotFoundException。谨记!
分享到:
评论

相关推荐

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    Java 反射封装 JavaBean

    使用 Java 反射封装 JavaBean &lt;br&gt; 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    "Java反射 JavaBean 对象自动生成插入、更新、删除、查询sql语句操作" Java反射JavaBean对象自动生成插入、更新、删除、查询sql语句操作是指通过Java反射机制,依据提供的表名、POJO类型、数据对象自动生成sql语句...

    java反射实现javabean转json实例代码.docx

    ### Java反射机制实现JavaBean转JSON的详细解析 #### 一、引言 在现代软件开发过程中,数据格式转换是一项非常常见的任务。特别是在处理不同系统之间的数据交换时,JSON(JavaScript Object Notation)因其轻量级...

    利用反射实现JavaBean 的自动赋值

    对于后者,一种常见的做法是利用Java的反射机制来自动地将表单数据绑定到JavaBean对象上。 #### 反射简介 反射是Java提供的一种能够在运行时分析类的信息并操作类的成员(如方法、属性)的能力。通过反射,可以在...

    java 根据javaBean反射自定义导出 excel、xml、pdf、csv

    在Java编程中,根据JavaBean反射来实现数据的导出,如Excel、XML、PDF和CSV格式,是一种常见的数据处理技术。JavaBean是Java中的一种设计模式,它提供了一种标准的方式来封装对象属性,便于数据操作。反射机制则是...

    使用反射封装javabean

    使用java反射机制封装javabean 项目当中使用的一个通用的方法

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作

    Java反射 JavaBean 对象自动生成插入、更新、删除、查询 SQL 语句操作 Java 反射是 Java 语言中一个强大的功能,它允许开发者在运行时检查和修改类、方法、字段的行为。Java 反射机制可以动态地创建对象、调用方法...

    Java反射学习.pdf

    Java 反射是 Java 程序设计语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说 "自审 ",并能直接操作程序的内部属性。Java 反射的能力在实际应用中非常有价值,例如,使用它能获得 Java 类中各成员的...

    Java Web开发 JavaBean封装数据库操作实例

    Java Web开发 JavaBean封装数据库操作实例

    基于Java反射的map自动装配JavaBean工具类设计示例代码

    描述 :"主要给大家介绍了关于基于Java反射的map自动装配JavaBean工具类设计的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起看看吧" ...

    JAVA100例之实例88JavaBean连接数据库

    总结起来,"JAVA100例之实例88JavaBean连接数据库"是一个关于如何在Java程序中利用JavaBean和JDBC进行数据库操作的示例。通过这个例子,你可以学习到JavaBean的设计原则,以及如何使用JDBC API来执行数据库查询和...

    早期自学java反射知识笔记

    Java 反射机制是指通过 Java 语言提供的一些 API 来访问和操作 Java 对象的结构和行为的机制。它允许程序在运行时检查和修改自身的结构和行为,而不需要在编译时知道这些信息。 ### Java 反射机制的应用场景 Java ...

    java自学==javabean实例

    Java自学之路:深入理解JavaBean实例 在Java编程中,JavaBean是一种特殊的Java类,它遵循特定的设计规范,主要用于数据封装、属性交换以及组件开发。JavaBean是Java平台上的一个核心概念,尤其在企业级应用开发中...

    对数据库操作的javabean

    总结来说,"对数据库操作的javabean"是一种通过JavaBean进行数据库交互的方式,它利用JDBC API连接数据库,执行SQL语句,并封装这些操作以提供给其他组件使用。通过这种方式,我们可以创建更健壮、可维护的Java应用...

    文件上传,java解析excel和csv 转javabean

    最后,处理完的Java Bean可以用于数据库操作,如存储到关系型数据库中,或者进一步的业务逻辑处理。记得在处理完文件后关闭所有打开的流和资源,以避免内存泄漏和资源浪费。 总结来说,Java提供了强大的工具来处理...

    用于提高java技术的资料 javaBeAN

    JavaBean是Java编程语言中的一种特定类,它遵循一定的规范,用于封装数据和业务逻辑,以便在Java应用程序或Web应用中重用。JavaBean的概念在软件开发中扮演着重要角色,尤其是在企业级应用开发中,它促进了组件的...

    java反射实现Object转json

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象的信息,包括类名、方法名、参数类型等。对于"java...

    Java Reflection (JAVA反射)

    JavaBean是反射机制的一个实际应用案例,它是一种遵循特定编码约定的Java类,通常用来表示简单的数据容器。通过反射,工具可以动态地加载JavaBean并获取其属性信息,进而实现可视化编辑和操作。例如,在IDE中可以...

    java+servlet+javabean实验报告(8)

    掌握web服务的基本概念和工作原理,学会创建和调用web服务。JUNIT测试的应用,程序的正确需要大量的测试,JUnit是一个Java测试框架,用于编写和运行可重复的测试。学会XFire框架下开发和配置web服务

Global site tag (gtag.js) - Google Analytics