1.cglib

BeanGenerator beanGenerator = new BeanGenerator();

beanGenerator.addProperty("id", Long.class);

beanGenerator.addProperty("username", String.class);

Object obj = beanGenerator.create();

BeanMap beanMap = BeanMap.create(obj);

BeanCopier copier = BeanCopier.create(User.class, obj.getClass(), false);

User user = new User();

user.setId(1L);

user.setUsername("name1");

user.setPassword("123");

copier.copy(user, obj, null);

System.out.println(beanMap.get("username"));Class clazz = obj.getClass();

Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {

System.out.println(methods[i].getName());

}

输出结果:

name1

getId

getUsername

setId

setUsername

从输出结果可以看出最后生成的obj只有id和username两个属性

2.org.apache.commons.beanutils

DynaProperty property = new DynaProperty("id", Long.class);

DynaProperty property1 = new DynaProperty("username", String.class);

BasicDynaClass basicDynaClass = new BasicDynaClass("user", null, newDynaProperty[]{property, property1});

BasicDynaBean basicDynaBean = new BasicDynaBean(basicDynaClass);

User user = new User();

user.setId(1L);

user.setUsername("name1");

user.setPassword("123");

BeanUtils.copyProperties(basicDynaBean, user);Map<String, Object> map = basicDynaBean.getMap();

Iterator<String> it = map.keySet().iterator();while (it.hasNext()) { String key = it.next();

System.out.println(key + ":" + map.get(key));

}

输入结果:

id:1username:name1

查看BasicDynaBean与BasicDynaClass之间的关系

DynaBean的源码

public interface DynaBean {

public boolean contains(String name, String key);

public Object get(String name);

public Object get(String name, int index);

public Object get(String name, String key);

public DynaClass getDynaClass();

public void remove(String name, String key);

public void set(String name, Object value);

public void set(String name, int index, Object value);

public void set(String name, String key, Object value);

}

主要是接口的定义

再来看看BasicDynaBean是怎么实现的,直接看public Object get(String name);

/**

* Return the value of a simple property with the specified name.

*

* @param name Name of the property whose value is to be retrieved

* @return The property's value

*

* @exception IllegalArgumentException if there is no property

* of the specified name

*/public Object get(String name) { // Return any non-null value for the specified property

Object value = values.get(name); if (value != null) { return (value);

} // Return a null value for a non-primitive property

Class<?> type = getDynaProperty(name).getType(); if (!type.isPrimitive()) { return(value);

} // Manufacture default values for primitive properties

if (type == Boolean.TYPE) { return (Boolean.FALSE);

} else if (type == Byte.TYPE) { return (new Byte((byte) 0));

} else if (type == Character.TYPE) { return (new Character((char) 0));

} else if (type == Double.TYPE) { return (new Double(0.0));

} else if (type == Float.TYPE) { return (new Float((float) 0.0));

} else if (type == Integer.TYPE) { return (new Integer(0));

} else if (type == Long.TYPE) { return (new Long(0));

} else if (type == Short.TYPE) { return (new Short((short) 0));

} else { return (null);

}

}

从以上代码可以看出是在values里取值的

/**

* The set of property values for this DynaBean, keyed by property name.

*/

protected HashMap<String, Object> values = new HashMap<String, Object>();

其实是用HashMap来实现的.

3.总结

用cglib动态删除添加属性时,虽然obj里有getUsername这个方法,却不能obj.getUsername()这样直接调用,想得到username的值只能通过beanMap.get("username")获取.

org.apache.commons.beanutils从源码来看是使用HashMap来实现的.

两种方式从操作角度来说和使用Map的区别不大.只是它们都提供了复制属性的工具方法.

JavaBean动态添加删除属性的更多相关文章

  1. js实现网页收藏功能,动态添加删除网址

    <html> <head> <title> 动态添加删除网址 </title> <meta charset="utf-8"&g ...

  2. 编辑 Ext 表格(一)——— 动态添加删除行列

    一.动态增删行 在 ext 表格中,动态添加行主要和表格绑定的 store 有关, 通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除.   (1) 动态添加表格的行  gridS ...

  3. 用Javascript动态添加删除HTML元素实例 (转载)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)

    介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...

  5. jquery动态添加删除div--事件绑定,对象克隆

    我想做一个可以动态添加删除div的功能.中间遇到一个问题,最后在manong123.com开发文摘 版主的热心帮助下解答了(答案在最后) 使用到的jquery方法和思想就是:事件的绑定和销毁(unbi ...

  6. jQuery动态添加删除CSS样式

    jQuery框架提供了两个CSS样式操作方法,一个是追加样式addClass,一个是移除样式removeClass,下面通过一个小例子讲解用法. jQuery动态追加移除CSS样式 <!DOCT ...

  7. JS动态添加删除html

    本功能要求是页面传一个List 集合给后台而且页面可以动态添加删除html代码需求如下: 下面是jsp页面代码 <%@ page language="java" pageEn ...

  8. 利用cglib给javabean动态添加属性,不用在建VO

    有的时候 比如你用的是hibernate或者Spring jdbc 来做dao层进行数据库相关的操作的时候,若果是单表的操作的时候 还比较简单 hibernate可直接返回(get,load)你的需要 ...

  9. JSON对象添加删除属性

    假如目前我们有如下一个Json对象 var jsonObj={ 'param1':22, 'param2' :33 }; 增加属性: 我们现在向该对象jsonObj中添加一个新的属性字段:param3 ...

随机推荐

  1. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  2. NFS介绍、服务端安装配置、NFS配置选项

    6月21日任务 14.1 NFS介绍14.2 NFS服务端安装配置14.3 NFS配置选项 14.1 NFS介绍 14.2 NFS服务端安装配置 1.首先需要2台机器,一台是服务端,一台是客户端,分别 ...

  3. 在jsp页面中设置中序号

    首先要使用<c>标签的话需要先引入下面这句话: <%@ taglib prefix="c" uri="http://Java.sun.com/jsp/j ...

  4. Reachability的用法 判断用户的网络状态

    - (void)viewDidLoad { [super viewDidLoad]; // 监听网络状态发生改变的通知 [[NSNotificationCenter defaultCenter] ad ...

  5. PHP计算两组经纬度坐标之间的距离

    定义π define('PI',3.1415926535898); define('EARTH_RADIUS',6378.137); 计算两组经纬度坐标 之间的距离 /** * 计算两组经纬度坐标 之 ...

  6. 前端js,如何在结构化与性能中做取舍。

    js发展中的问题 随着前端web技术的发展,js要解决的问题也变得越来越多,越来越复杂. 解决更复杂的问题,需要更好的结构. 解决更复杂的问题,也需要更好的性能. 结构的优化在一定程度上会牺牲性能,同 ...

  7. 漫谈边缘计算(三):5G的好拍档

    边缘计算的热度迅速攀升,还有一个不得不提的因素,就是5G的发展. [5G推动云计算从集中化向分布式演进] 在第一篇文章(<漫谈边缘计算(一):边缘计算是大势所趋>)中我提到,传统的云计算技 ...

  8. springcloud集成redis

    1.application.properties/application.yml配置: redis: # redis数据库索引(默认为0),我们使用索引为3的数据库,避免和其他数据库冲突 databa ...

  9. iOS使用Workspace来管理多项目 ( 转 )

    开发中会有一些常用的类或方法,或者是某个特定功能的,比如一个自定义的弹框.一个更容易使用的网络请求库,可以把它们放到一个单独的工程里,通过静态库(library.FrameWork)的方式应用到任何其 ...

  10. DataFrame 链式赋值

    在运行以下Python代码时,Pandas抛出SettingWithCopyWarning警告: row_data = df_pred.loc[key] row_data['col'] = new_v ...