Java动态生成类以及动态添加属性
2014-08-10 17:25
399 查看
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件。
那么技术实现支持:使用cglib代理。
具体的实现步骤:
1.cglib的jar包(cglib-nodep):我用的是cglib-nodep-2.2.jar
2.封装的cglib类:
3.需求的实现类:
4.技术实现目的:前台框架表格数据源实际上就是带有数据的实体,但是grid中数据的类型、已经是否可见、toolbar工具栏上的按钮、是否分页,是针对实体而言,所以目前把这些信息作为实体的配置文件。在展示页面之前,读取全部信息,转为参数对象的完整对象。
那么技术实现支持:使用cglib代理。
具体的实现步骤:
1.cglib的jar包(cglib-nodep):我用的是cglib-nodep-2.2.jar
2.封装的cglib类:
package com.citics.test.model; import java.util.Iterator; import java.util.Map; import java.util.Set; import net.sf.cglib.beans.BeanGenerator; import net.sf.cglib.beans.BeanMap; public class DynamicBean { private Object object = null;//动态生成的类 private BeanMap beanMap = null;//存放属性名称以及属性的类型 public DynamicBean() { super(); } @SuppressWarnings("rawtypes") public DynamicBean(Map propertyMap) { this.object = generateBean(propertyMap); this.beanMap = BeanMap.create(this.object); } /** * 给bean属性赋值 * @param property 属性名 * @param value 值 */ public void setValue(Object property, Object value) { beanMap.put(property, value); } /** * 通过属性名得到属性值 * @param property 属性名 * @return 值 */ public Object getValue(String property) { return beanMap.get(property); } /** * 得到该实体bean对象 * @return */ public Object getObject() { return this.object; } /** * @param propertyMap * @return */ @SuppressWarnings("rawtypes") private Object generateBean(Map propertyMap) { BeanGenerator generator = new BeanGenerator(); Set keySet = propertyMap.keySet(); for (Iterator i = keySet.iterator(); i.hasNext();) { String key = (String) i.next(); generator.addProperty(key, (Class) propertyMap.get(key)); } return generator.create(); } }
3.需求的实现类:
package com.citics.platformx.test.controller; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Set; import com.citics.test.model.DynamicBean; import com.citics.test.model.LeapRole; public class ClassUtil { private String filepath="/config/";//配置文件路径 public String getFilepath() { return filepath; } public void setFilepath(String filepath) { this.filepath = filepath; } @SuppressWarnings({ "rawtypes","unchecked"}) public Object dynamicClass(Object object) throws Exception{ HashMap returnMap = new HashMap(); HashMap typeMap=new HashMap(); //读取配置文件 Properties prop=new Properties(); String sourcepackage=object.getClass().getName(); String classname=sourcepackage.substring(sourcepackage.lastIndexOf(".")+1); InputStream in=ClassUtil.class.getResourceAsStream(filepath+classname+".properties"); prop.load(in); Set<String> keylist=prop.stringPropertyNames(); Class type=object.getClass(); BeanInfo beanInfo = Introspector.getBeanInfo(type); PropertyDescriptor[] propertyDescriptors=beanInfo.getPropertyDescriptors(); for(int i=0;i<propertyDescriptors.length;i++){ PropertyDescriptor descriptor=propertyDescriptors[i]; String propertyName = descriptor.getName(); if(!propertyName.equals("class")){ Method readMethod=descriptor.getReadMethod(); Object result = readMethod.invoke(object, new Object[0]); if (result != null) { returnMap.put(propertyName, result); } else { returnMap.put(propertyName, ""); } typeMap.put(propertyName, descriptor.getPropertyType()); } } //加载配置文件中的属性 Iterator<String> iterator=keylist.iterator(); while(iterator.hasNext()){ String key=iterator.next(); returnMap.put(key, prop.getProperty(key)); typeMap.put(key, Class.forName("java.lang.String")); } //map转换成实体对象 DynamicBean bean = new DynamicBean(typeMap); //赋值 Set keys=typeMap.keySet(); for(Iterator it=keys.iterator();it.hasNext();){ String key = (String) it.next(); bean.setValue(key, returnMap.get(key)); } Object obj=bean.getObject(); return obj; } public static void main(String[] args) throws Exception{ new ClassUtil().dynamicClass(new LeapRole()); } }
4.技术实现目的:前台框架表格数据源实际上就是带有数据的实体,但是grid中数据的类型、已经是否可见、toolbar工具栏上的按钮、是否分页,是针对实体而言,所以目前把这些信息作为实体的配置文件。在展示页面之前,读取全部信息,转为参数对象的完整对象。
相关文章推荐
- Java动态生成类以及动态添加属性
- 用js动态添加html元素,以及属性
- 用js动态添加html元素,以及属性的简单实例
- jQuery1.9为动态添加元素绑定事件以及获取和操作checkbox的选择属性
- JAVA“动态”为类添加属性
- Android 动态添加Spinner(.java文件内实现) 实现 改变spinner 内文字属性
- DOM3_table相关属性以及Js方法动态添加
- jQuery1.9为动态添加元素绑定事件以及获取和操作checkbox的选择属性11
- JS动态添加HTML自定义属性以及处理HTML元素的自定义属性(兼容FIREFOX和IE)
- Android中的基础-----如何使用JAVA动态的添加并设置组件属性
- 关于如何利用原生js动态给一个空对象添加属性以及属性值
- JAVA“动态”为类添加属性
- jquery如何给对象动态添加属性以及选择器、事件的绑定
- jquery如何给对象动态添加属性以及选择器、事件的绑定
- jQuery1.9为动态添加元素绑定事件以及获取和操作checkbox的选择属性
- runtime跳转界面以及动态添加属性
- Js脚本:动态添加HTML自定义属性以及处理html元素的自定义属性(兼容Firefox和IE)
- Js脚本:动态添加HTML自定义属性以及处理html元素的自定义属性(兼容Firefox和IE)
- 不同分类的商品动态添加属性
- Java 语言是否应增加闭包以及如何添加?