Java 动态实例化对象并且动态调用 setter 方法进行设置值 (陈亮泛原创)
(2012-03-23 17:41:39)
标签:
java动态对象实例属性赋值it |
分类: Java |
本人刚工作一年,因为项目中不断遇到麻烦事,实现的方法是有,但是很臃肿,所以不断的在找资料并且动手优化代码质量。就最近一个项目中,遇到一个麻烦事儿,调用存储过程,返回一个List<HashMap<Object,Object>>的嵌套列表。然后取具体的值到压缩到对象中传送给页面。我脑子转不快,想了很多方法都行不通。(别拍砖,刚工作一年。)
因为存到HashMap的Key和Values都比较混乱,没有循序可言。所以在持久层进行赋值应该不行,就考虑到业务层中进行转换,一下是我用到的方法与代码
。。 各位看官别太狠拍砖。
首先模拟出数据对象
的结构
Student对象就2个字段
public class Student {
//专程在这用驼峰命名法,因为等下判断很多人都会遇到一个错误。等下解释
private String nameTest;
private int ageTestAaBbCc;
//get set 方法我就不写了吧。但是一定要的,各位看官记得要加上
}
首先模拟出
Student对象就2个字段
public class Student {
//专程在这用驼峰命名法,因为等下判断很多人都会遇到一个错误。等下解释
private String nameTest;
private int ageTestAaBbCc;
//get set 方法我就不写了吧。但是一定要的,各位看官记得要加上
}
List<HashMap<Object,Object>>
lists = new
ArrayList<HashMap<Object,Object>>();
List<Student> stus = new
ArrayList<Student>();
HashMap<Object, Object> testHM =
new HashMap<Object,Object>();
testHM.put("NAMETEST", "xx1");
testHM.put("AGETESTAABBCC", 0.18);
HashMap<Object, Object> testHM1
= new HashMap<Object,Object>();
testHM1.put("NAMETEST", "xx2");
testHM1.put("AGETESTAABBCC", 1);
HashMap<Object, Object> testHM2
= new HashMap<Object,Object>();
testHM2.put("NAMETEST", "信息");
testHM2.put("AGETESTAABBCC", 2);
HashMap<Object, Object> testHM3
= new HashMap<Object,Object>();
testHM3.put("NAMETEST", "xx3");
testHM3.put("AGETESTAABBCC", 3);
HashMap<Object, Object> testHM4
= new HashMap<Object,Object>();
testHM4.put("NAMETEST", "xx4");
testHM4.put("AGETESTAABBCC", 4);
lists.add(testHM);
lists.add(testHM1);
lists.add(testHM2);
lists.add(testHM3);
lists.add(testHM4);
数据对象的结构大致上出来了。就是这个lists。接下来我们遍历lists并且压缩到 具体的对象当中。
首先通过foreach遍历lists 拿到 HashMap<Object,Object>
数据对象的结构大致上出来了。就是这个lists。接下来我们遍历lists并且压缩到 具体的对象当中。
首先通过foreach遍历lists 拿到 HashMap<Object,Object>
这个Class是用来动态生成实例对象的必须项。
private List tests(List<HashMap<Object,Object>> target,Class beanClass){
List<Object> objList = new ArrayList<Object>();
for (HashMap<Object, Object> hashMap : target ) {
for (HashMap<Object, Object> hashMap : target) {
Iterator iterator = hashMap.entrySet().iterator();
//stu动态生成由外部传来的具体某个对象。
Object stu = beanClass.newInstance();
//获取该对象中的属性列表(等下判断的时候用到的)
Field[] f=stu.getClass().getDeclaredFields();
//这个是通过Spring 的动态Bean操作完成 对象的赋值操作。
BeanWrapper bw = new BeanWrapperImpl(stu);
while (iterator.hasNext()) {
Entry entry = (Entry) iterator.next();
//拿到Key(数据库字段名做为Key。全大写)
Object value= entry.getValue();
//拿到Value
Object key =entry.getKey();
//接下来就是驼峰命名法的铺垫了,因为字段名不可能全都是小写或者大写的,肯定有不规则的,所以拿到上面的属性列表
就起到了判断的作用了。因为属性列表和数据库字段的个数都是一样的,所以需要做循环判断
for(int i=0;i<f.length;i++){
//通过判断Key的小写和属性列表的小写是否一致。就知道当前Value该放到那个属性中。
if(key.toString().toLowerCase().equals(f[i].getName().toLowerCase())){
//设置属性值 。 注意 第一个参数是对象的属性名称,不是全小写的,是驼峰命名法的,所以直接到getName()就可以了,不用toLowerCase变小写了。
bw.setPropertyValue(f[i].getName(), value.toString());
}
}
}
//然后将对象添加到List中。完成
objList.add(stu);
return objList;
}
}
大致上就是这样。。。各位轻拍,我会慢慢改进的。
private List tests(List<HashMap<Object,Object>> target,Class beanClass){
List<Object> objList = new ArrayList<Object>();
for (HashMap<Object, Object> hashMap :
for (HashMap<Object, Object> hashMap : target) {
Iterator iterator = hashMap.entrySet().iterator();
//stu动态生成由外部传来的具体某个对象。
Object stu = beanClass.newInstance();
//获取该对象中的属性列表(等下判断的时候用到的)
Field[] f=stu.getClass().getDeclaredFields();
//这个是通过Spring 的动态Bean操作完成 对象的赋值操作。
BeanWrapper bw = new BeanWrapperImpl(stu);
while (iterator.hasNext()) {
Entry entry = (Entry) iterator.next();
//拿到Key(数据库字段名做为Key。全大写)
Object value= entry.getValue();
//拿到Value
Object key =entry.getKey();
//接下来就是驼峰命名法的铺垫了,因为字段名不可能全都是小写或者大写的,肯定有不规则的,所以拿到上面的
for(int i=0;i<f.length;i++){
//通过判断Key的小写和属性列表的小写是否一致。就知道当前Value该放到那个属性中。
if(key.toString().toLowerCase().equals(f[i].getName().toLowerCase())){
//设置属性值 。 注意 第一个参数是对象的属性名称,不是全小写的,是驼峰命名法的,所以直接到getName()就可以了,不用toLowerCase变小写了。
bw.setPropertyValue(f[i].getName(), value.toString());
}
}
}
//然后将对象添加到List中。完成
objList.add(stu);
return objList;
}
}
大致上就是这样。。。各位轻拍,我会慢慢改进的。