java通过cglib动态生成实体bean的操作
maven依赖:
commons-beanutils commons-beanutils 1.9.3 cglib cglib-nodep 3.2.4
DynamicBeanEntity.class动态bean类:
packagecom.dym.entity; importnet.sf.cglib.beans.BeanGenerator; importorg.apache.commons.collections.map.MultiValueMap; importjava.lang.reflect.*; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.Iterator; importjava.util.Map; /** *@author:zhaoxu *@description: */ publicclassDynamicBeanEntity{ ObjectdynamicBean; Classclazz; publicDynamicBeanEntity(MapdynAttrMap){ this.dynamicBean=generateBean(dynAttrMap); clazz=dynamicBean.getClass(); } /** *获取所有属性值 * *@return *@throwsIllegalAccessException */ publicMapgetValues()throwsIllegalAccessException{ Map fieldValuesMap=newHashMap(16); Field[]fields=clazz.getDeclaredFields(); for(Fieldfield:fields){ field.setAccessible(true); ObjectfieldValue=field.get(dynamicBean); fieldValuesMap.put(field.getName().split("\\$cglib_prop_")[1],fieldValue); } returnfieldValuesMap; } /** *获取动态bean所有方法信息 * *@return */ publicMultiValueMapgetMethods(){ MultiValueMapmap=newMultiValueMap(); Method[]methods=clazz.getMethods(); for(Methodmethod:methods){ Type[]genericParameterTypes=method.getGenericParameterTypes(); if(genericParameterTypes.length>0){ for(Typetype:genericParameterTypes){ map.put(method.getName(),type); } }else{ map.put(method.getName(),null); } } returnmap; } /** *执行某个方法 * *@parammethodName *@paramparameters *@return *@throwsInvocationTargetException *@throwsIllegalAccessException *@throwsNoSuchMethodException */ publicObjectexecuteMethod(StringmethodName,Object...parameters)throwsInvocationTargetException,IllegalAccessException,NoSuchMethodException{ ArrayList paramTypeList=newArrayList(); for(ObjectparamType:parameters){ paramTypeList.add(paramType.getClass()); } Class[]classArray=newClass[paramTypeList.size()]; Methodmethod=clazz.getMethod(methodName,paramTypeList.toArray(classArray)); Objectinvoke=method.invoke(dynamicBean,parameters); returninvoke; } /** *设置属性值 * *@paramproperty *@paramvalue *@throwsNoSuchFieldException *@throwsIllegalAccessException */ publicvoidsetValue(Stringproperty,Objectvalue)throwsNoSuchFieldException,IllegalAccessException{ FielddeclaredField=clazz.getDeclaredField("$cglib_prop_"+property); declaredField.setAccessible(true); declaredField.set(dynamicBean,value); } /** *获取属性值 * *@paramproperty *@return *@throwsNoSuchFieldException *@throwsIllegalAccessException */ publicObjectgetValue(Stringproperty)throwsNoSuchFieldException,IllegalAccessException{ FielddeclaredField=clazz.getDeclaredField("$cglib_prop_"+property); declaredField.setAccessible(true); Objectvalue=declaredField.get(dynamicBean); returnvalue; } publicObjectgetEntity(){ returnthis.dynamicBean; } /** *利用cglib的BeanGenerator创建对象 * *@paramdynAttrMap *@return */ privateObjectgenerateBean(MapdynAttrMap){ BeanGeneratorgenerator=newBeanGenerator(); Iteratoriterator=dynAttrMap.keySet().iterator(); while(iterator.hasNext()){ Stringkey=iterator.next().toString(); generator.addProperty(key,(Class)dynAttrMap.get(key)); } returngenerator.create(); } }
test.class测试类测试动态生成bean
packagecom.dym.attr; importcom.dym.entity.DynamicBeanEntity; importorg.apache.commons.collections.map.MultiValueMap; importjava.lang.reflect.InvocationTargetException; importjava.util.HashMap; importjava.util.Map; /** *@author:zhaoxu *@description: */ publicclasstest{ publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException,NoSuchMethodException,InvocationTargetException{ //设置属性们,默认16 HashMappropertyMap=newHashMap(16); propertyMap.put("name",String.class); propertyMap.put("age",Integer.class); propertyMap.put("height",Double.class); //生成动态Entity DynamicBeanEntitybean=newDynamicBeanEntity(propertyMap); //设置属性值 bean.setValue("name","zx"); bean.setValue("age",22); bean.setValue("height",175.0); //获取属性值 Mapvalues=bean.getValues(); //获取可执行的方法 MultiValueMapmethods=bean.getMethods(); //执行某个方法 bean.executeMethod("setAge",23); System.out.println("动态bean的age属性:"+bean.getValue("age")); } }
test.class测试类测试链接数据库动态生成bean
packagecom.dym.test; importcom.dym.util.DBUtil; importcom.dym.util.DynmicEntity; importorg.springframework.stereotype.Component; importjava.sql.Connection; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.Map; /** *@author:zhaoxu *@description: */ @Component publicclasstest{ publicstaticvoidmain(String[]args){ ArrayListbeans=newArrayList<>(); Connectionconn=null; PreparedStatementprst=null; Stringsql=""; sql="selecttable_namefrominformation_schema.tableswheretable_schema=\'public\'"; conn=DBUtil.getConn(); try{ prst=conn.prepareStatement(sql); ResultSetrs=prst.executeQuery(); while(rs.next()){ StringtableName=rs.getString(1); MapattrMap=newHashMap<>(); StringfindFieldSql="SELECTformat_type(a.atttypid,a.atttypmod)astype,a.attnameasname,a.attnotnullasnotnull\n"+ "FROMpg_classasc,pg_attributeasawherec.relname=\'"+tableName+"\'anda.attrelid=c.oidanda.attnum>0"; PreparedStatementfieldsPrst=conn.prepareStatement(findFieldSql); ResultSetfieldsRs=fieldsPrst.executeQuery(); while(fieldsRs.next()){ StringfieldType=fieldsRs.getString(1); StringfieldName=fieldsRs.getString(2); attrMap.put(fieldName,Object.class); } DynmicEntitybean=newDynmicEntity(attrMap); beans.add(bean); } }catch(SQLExceptione){ e.printStackTrace(); } DBUtil.close(prst,conn); } }
DBUtil.class:
packagecom.dym.util; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; /** *@author:zhaoxu *@description: */ publicclassDBUtil{ privatefinalstaticStringURL="jdbc:postgresql://localhost:5432/dynmic"; privatefinalstaticStringNAME="postgres"; privatefinalstaticStringPASS="123456"; privatestaticConnectionconn=null; /** * *@Title:DBUtil *@Description: */ publicDBUtil(){ } /** * *@TiltlegetConn *@returnConnection *@Description:返回连接 */ publicstaticConnectiongetConn(){ //告诉jvm使用mysql try{ //加载驱动,string为驱动名字 Class.forName("org.postgresql.Driver"); //连接数据库,得到Connection连接 conn=DriverManager.getConnection(URL,NAME,PASS); //System.out.println("连接数据库:"+conn); }catch(ClassNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } returnconn; } //关闭结果对象集 publicstaticvoidclose(ResultSetrs){ if(rs!=null){ try{ rs.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } //关闭编译语句对象 publicstaticvoidclose(PreparedStatementprst){ if(prst!=null){ try{ prst.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } //关闭结果对象集 publicstaticvoidclose(Connectionconn){ if(conn!=null){ try{ conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } //对于更新操作关闭资源 publicstaticvoidclose(PreparedStatementprst,Connectionconn){ close(prst); close(conn); } //关闭所有 publicstaticvoidclose(ResultSetrs,PreparedStatementprst,Connectionconn){ close(rs); close(prst); close(conn); } }
补充:java反射json动态转实体类
我就废话不多说了,大家还是直接看代码吧~
packagetest.refect; publicclassStudent{ //姓名 privateStringname; //年龄 privateStringage; //住址 privateStringaddress; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetAge(){ returnage; } publicvoidsetAge(Stringage){ this.age=age; } publicStringgetAddress(){ returnaddress; } publicvoidsetAddress(Stringaddress){ this.address=address; } @Override publicStringtoString(){ return"Student[name="+name+",age="+age+",address="+address+"]"; } publicvoidsayHello(Bookbook){ System.out.println(book.getName()); } }
packagetest.refect; publicclassBook{ privateStringname; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } }
packagetest.refect; importjava.lang.reflect.Field; importjava.lang.reflect.Method; importjava.net.URLDecoder; importjava.util.Iterator; importnet.sf.json.JSONObject; publicclassMain{ publicstaticvoidmain(String[]args)throwsException{ //Studentstr-->Student主类 Stringstr="test.refect.Student"; Class>clazz=Class.forName(str); //Book实体str-->Book参数类 StringbookStr="test.refect.Book"; Class>bookClazz=Class.forName(bookStr); //json-->Book将参数类转为JSONOBJECT StringbookJson="{\"name\":\"Java\"}"; JSONObjectjsonObject=JSONObject.fromObject(bookJson); //实例化参数类 ObjectbookInStance=bookClazz.newInstance(); //通过JSONOBJECT为参数类赋值 Iterator>keys=jsonObject.keys(); while(keys.hasNext()){ Objectkey=keys.next(); Objectvalue=jsonObject.get(key); //替换非法字符 String_key=String.valueOf(key).replaceFirst("\\W",""); Fieldfield=bookClazz.getDeclaredField(_key); field.setAccessible(true); field.set(bookInStance,URLDecoder.decode(String.valueOf(value),"UTF-8")); field.setAccessible(false); } //将参数类注入到主类 Methodmethod=clazz.getDeclaredMethod("sayHello",bookClazz); //执行主类 method.invoke(clazz.newInstance(),bookInStance); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。