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{
MapfieldValuesMap=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{
ArrayListparamTypeList=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。