java object 添加属性_JavaBean动态添加删除属性

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 map = basicdynabean.getmap();

iterator it = map.keyset().iterator();while (it.hasnext()) { string key = it.next();

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

}

输入结果:

id:1username:name1

查看basicdynabean与basicdynaclass之间的关系

d0f64fa05c29ed0bed95b763e30d1a6a.png

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 values = new hashmap();

其实是用hashmap来实现的.

be2e9dddf7a0a0b1ceb85d37772f7a52.png

3.总结

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

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

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值