`
longgangbai
  • 浏览: 7339162 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Commons-BeanUtils中动态bean的学习的应用(类型Flex和javascript的动态添加属性)

阅读更多

 

  使用过Javascript和Flex的人,一定对这两种语言的中对象的中动态添加属性感到好奇,特别是Flex,其实如果你仔细看一下Commons-beanUtils的帮助文档,你会发现其实也没有什么,Java也可以实现动态添加属性。

commons-beanutils的常用功能包括类型转换和动态bean的创建。
关于类型转换主要用到BeanUtils 和 ConvertUtils。BeanUtils的使用是大家最熟悉的了。将javax.servlet.HttpServletRequest接受的参数转换到对应到指定的JavaBean,这是Struts等许多MVC框架中的基本服务之一。
在一次HTTP请求中,请求参数值都是字符串或字符串数组,大多数值需要被转换为底层的数据类型。BeanUtils提供了属性的setter方法,以接受字符串的值,并自动把它们转换成合适的属性类型,和getter方法,当调用getter方法时,又进行一次类型转换。除此之外,populate()方法可以把一个map中的键值对转换为bean里面的属性和值。例如
 

类型转换

 

    HttpServletRequest request = ...;
    MyBean bean = ...;
    HashMap map = new HashMap();
    Enumeration names = request.getParameterNames();
    while (names.hasMoreElements()) {
      String name = (String) names.nextElement();
      map.put(name, request.getParameterValues(name));
    }
    BeanUtils.populate(bean, map);


  当然BeanUtils底层依赖于ConvertUtils。ConvertUtils的使用简单,常用方法如下

static String convert(Object value) //转换指定值为字符串
static Object convert(Object value, Class targetType) //转换指定值为指定的类
static Object convert(String[] values, Class clazz) //将字符串数组转换为指定类型的数组
static Object convert(String value, Class clazz)   //转换字符串为一指定类型
        


下面举例说明(如无特别说明,下面的所有Java代码均以此xml文件为操作对象)

<?xml version="1.0" encoding="UTF-8"?>
<origin dataSource="ds">
	<columns>
				<column code="ID" name="" type="java.lang.Integer" length="" />
				<column code="FIRSTNAME" name="" type="java.lang.String" length="" />
				<column code="LASTNAME" name="" type="java.lang.String" length="" />
				<column code="SEX" name="" type="java.lang.String" length="" />
	</columns>
		
</origin>

 

XMLConfiguration config = new XMLConfiguration(String); //关于XML的读取在“commons-configuration的使用”中讲过
String id = config.getString("columns.column.[@code]");   //拿到第一个Column的code
String type = config.getString("columns.column.[@type]"); //拿到第一个Column的type
Object value = ConvertUtils.convert(id,Class.forName(type)); //转换了



动态bean的创建也很简单,常用API如下

动态Bean的创建

 

org.apache.commons.beanutils.DynaBean
org.apache.commons.beanutils.DynaClass
org.apache.commons.beanutils.BasicDynaBean      //实现了DynaBean
org.apache.commons.beanutils.BasicDynaClass     //实现了DynaClass
org.apache.commons.beanutils.DynaProperty


第一步,就是要创建动态class

DynaProperty[] props = new DynaProperty[]{
        new DynaProperty("address", java.util.Map.class),
        new DynaProperty("subordinate", mypackage.Employee[].class),
        new DynaProperty("firstName", String.class),
        new DynaProperty("lastName",  String.class)
      };  //
    BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props); //主要是构造props动态属性数组,名字"employee"和bean类型(这里是null)无关紧要

第二步,创建动态bean

  
    DynaBean employee = dynaClass.newInstance();
    employee.set("address", new HashMap());
    employee.set("subordinate", new mypackage.Employee[0]);
    employee.set("firstName", "Fred");
    employee.set("lastName", "Flintstone");


现在,把xml文件中的所有column属性构造一个动态class(动态class.newInstance()就可以生成一个bean了,所以不讨论动态bean),在如下代码中originDynaClass就是生成的动态class

	List<HierarchicalConfiguration>  columns = (List<HierarchicalConfiguration>) config.configurationsAt("origin.bean.columns.column");
		DynaProperty[] properties = new DynaProperty[columns.size()];
		for (int i = 0; i < columns.size(); i++) {
			HierarchicalConfiguration column = (HierarchicalConfiguration)columns.get(i);
			try {
				properties[i] = new DynaProperty(column.getString("[@code]"),Class.forName(column.getString("[@type]")));
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				logger.error("类型转换异常", e);
			}
		}
	BasicDynaClass	originDynaClass = new BasicDynaClass ("origin", BasicDynaBean.class,  properties);


 

package cn.com.unutrip.java.opensource.apache.beanutils;

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.beanutils.LazyDynaBean;

/**
 * BeanUtils中动态bean的学习的应用
 *
 * @author longgangbai
 *
 */
public class DynaBeansExampleV1 {
 public static void main(String args[]) throws Exception {
  Object movie = createMovieBean();
  System.err.println(BeanUtils.getProperty(movie, "title"));
  System.err.println(BeanUtils.getProperty(movie, "director.name"));
 }
   
 private static Object createMovieBean() throws Exception {

  // first create the properties
  DynaProperty properties[] = new DynaProperty[] { new DynaProperty("title", String.class), new DynaProperty("dateOfRelease", Date.class),
    new DynaProperty("keywords", String[].class), new DynaProperty("genre", Map.class), new DynaProperty("actors", List.class),
    new DynaProperty("director", DynaBean.class) };

  // next using the properties define the class
  DynaClass movieClass = new BasicDynaClass("movie", null, properties);

  // now, with the class, create a new instance
  DynaBean movieBean = movieClass.newInstance();

  // set its properties
  movieBean.set("title", "The Italian Job");
  movieBean.set("dateOfRelease", new GregorianCalendar(1969, 0, 1).getTime());
  movieBean.set("keywords", new String[] { "Italy", "Bank Robbery" });

  Map genre = new HashMap();
  genre.put("THR", "Thriller");

  movieBean.set("genre", genre);
  movieBean.set("genre", "ACT", "Action");

  DynaBean director = createPersonBean();
  director.set("name", "Peter Collinson");
  director.set("gender", new Integer(1));

  movieBean.set("director", director);

  return movieBean;
 }

 private static DynaBean createPersonBean() {
  DynaBean person = new LazyDynaBean();
  return person;
 }
}

分享到:
评论

相关推荐

    commons-beanutils-1.9.4-API文档-中文版.zip

    赠送jar包:commons-beanutils-1.9.4.jar; 赠送原API文档:commons-beanutils-1.9.4-javadoc.jar; 赠送源代码:commons-beanutils-1.9.4-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.9.4.pom; ...

    commons-beanutils-1.8.0 jar包下载

    commons-beanutils-1.8.0 jar包: 1.commons-beanutils-1.8.0.jar 2.commons-beanutils-1.8.0-javadoc.jar ...4.commons-beanutils-bean-collections-1.8.0.jar 5.commons-beanutils-core-1.8.0.jar

    commons-beanutils-1.9.4

    在本文中,我们将深入探讨`commons-beanutils-1.9.4`这个版本,了解其核心功能、使用场景以及如何在项目中集成和应用。 Apache Commons BeanUtils库的主要目标是简化JavaBean对象的属性访问。它通过提供一系列静态...

    commons-beanutils-1.8.3和commons-beanutils-1.8.0

    在给定的压缩包文件中,包含了两个版本的Apache Commons BeanUtils库:`commons-beanutils-1.8.0`和`commons-beanutils-1.8.3`。 Apache Commons BeanUtils的核心功能包括: 1. **属性访问**:BeanUtils提供了一...

    commons-beanutils-1.9.4-API文档-中英对照版.zip

    赠送jar包:commons-beanutils-1.9.4.jar; 赠送原API文档:commons-beanutils-1.9.4-javadoc.jar; 赠送源代码:commons-beanutils-1.9.4-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.9.4.pom; ...

    commons-beanutils-1.7.0.jar-解决commons-beanutils和commons-collections重复类

    解决办法是把commons-beanutils中的org/apache/commons/collections删除,这里上传一个改好可以直接使用的。

    commons-beanutils-1.8.3.jar.zip

    在实际应用中,`commons-beanutils-1.8.3.jar`常与其他Apache Commons库(如Collections、Lang等)结合使用,以实现更强大的功能。例如,结合Commons Collections,可以方便地处理复杂的数据结构;结合Commons Lang...

    commons-beanutils (1.7.0 -1.9.2)6个

    - **属性访问**:`commons-beanutils` 提供了`BeanUtils`类,能够通过反射机制动态地访问Bean的属性,支持属性的读取和设置。 - **属性拷贝**:`copyProperties()`方法使得能够将一个Bean的所有属性值复制到另一个...

    commons-beanutils-1.9.3jar包source包及相关jar包

    `commons-beanutils-1.9.3-sources.jar`则是源代码包,它包含了BeanUtils库的完整源代码,这对于开发者进行调试、学习和自定义扩展非常有用。通过查看源代码,可以深入理解内部的工作机制,以及如何有效地利用这些...

    commons-beanutils-bean-collections.jar下载

    commons-beanutils-bean-collections.jar commons-beanutils-bean-collections.jar

    commons-beanutils-1.9.3-API文档-中英对照版.zip

    赠送jar包:commons-beanutils-1.9.3.jar; 赠送原API文档:commons-beanutils-1.9.3-javadoc.jar; 赠送源代码:commons-beanutils-1.9.3-sources.jar; 包含翻译后的API文档:commons-beanutils-1.9.3-javadoc-...

    commons-beanutils、commons-collections、commons-collections等常用jar 包下载

    这三款库在Java开发中应用广泛,特别是在处理对象属性、集合操作和通用工具类时。它们使得代码更加简洁,减少了重复工作,并提高了代码的可读性和可维护性。在实际项目中,根据需求选择合适版本的Apache Commons库,...

    commons-beanutils-1.9.3-API文档-中文版.zip

    赠送jar包:commons-beanutils-1.9.3.jar; 赠送原API文档:commons-beanutils-1.9.3-javadoc.jar; 赠送源代码:commons-beanutils-1.9.3-sources.jar; 包含翻译后的API文档:commons-beanutils-1.9.3-javadoc-...

    commons-beanutils-1.9.1.jar<---&gt;commons-logging-1.1.3.jar

    总的来说,`commons-beanutils-1.9.1.jar`和`commons-logging-1.1.3.jar`是Java开发中的两个重要工具,它们简化了JavaBeans的操作,并提供了灵活的日志机制。这两个库的结合使用,体现了Java设计原则中的“依赖倒置...

    commons-beanutils-1.7.0-API文档-中英对照版.zip

    赠送jar包:commons-beanutils-1.7.0.jar; 赠送原API文档:commons-beanutils-1.7.0-javadoc.jar; 赠送源代码:commons-beanutils-1.7.0-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.7.0.pom; ...

    commons-beanutils-1.9.1-API文档-中文版.zip

    赠送jar包:commons-beanutils-1.9.1.jar; 赠送原API文档:commons-beanutils-1.9.1-javadoc.jar; 赠送源代码:commons-beanutils-1.9.1-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.9.1.pom; ...

    commons-beanutils-1.7.0-API文档-中文版.zip

    赠送jar包:commons-beanutils-1.7.0.jar; 赠送原API文档:commons-beanutils-1.7.0-javadoc.jar; 赠送源代码:commons-beanutils-1.7.0-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.7.0.pom; ...

    commons-beanutils-1.9.3.jar

    而Apache Commons BeanUtils库则为这些操作提供了便利,它通过反射机制来动态地访问和修改JavaBean的属性,使得代码更加简洁和易维护。 1. **属性访问与设置** BeanUtils库的核心功能就是属性的访问和设置。通过`...

    commons-beanutils-1.8.2.jar,commons-codec-1.4.jar

    commons-beanutils-1.8.2.jar,commons-codec-1.4.jar,commons-collections-3.2.1.jar,commons-dbcp-1.2.2.jar,commons-digester-2.0.jar,commons-fileupload-1.2.1.jar,commons-httpclient.jar,commons-io-...

    commons-beanutils.jar commons-collections-3.1.jar commons-pool-1.2.jar

    这里提到的三个JAR文件——`commons-beanutils.jar`、`commons-collections-3.1.jar`和`commons-pool-1.2.jar`,都是Apache Commons项目的一部分,分别涉及Bean操作、集合操作和对象池化。 **1. `commons-beanutils...

Global site tag (gtag.js) - Google Analytics