电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java通過cglib動態生成實體bean的操作

瀏覽:74日期:2022-08-16 17:15:41
maven依賴:

<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.2.4</version> </dependency>DynamicBeanEntity.class動態bean類:

package com.dym.entity;import net.sf.cglib.beans.BeanGenerator;import org.apache.commons.collections.map.MultiValueMap;import java.lang.reflect.*;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/** * @author: zhaoxu * @description: */public class DynamicBeanEntity { Object dynamicBean; Class clazz; public DynamicBeanEntity(Map dynAttrMap) { this.dynamicBean = generateBean(dynAttrMap); clazz = dynamicBean.getClass(); } /** * 獲取所有屬性值 * * @return * @throws IllegalAccessException */ public Map<String, Object> getValues() throws IllegalAccessException { Map<String, Object> fieldValuesMap = new HashMap(16); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object fieldValue = field.get(dynamicBean); fieldValuesMap.put(field.getName().split('$cglib_prop_')[1], fieldValue); } return fieldValuesMap; } /** * 獲取動態bean所有方法信息 * * @return */ public MultiValueMap getMethods() { MultiValueMap map = new MultiValueMap(); Method[] methods = clazz.getMethods(); for (Method method : methods) { Type[] genericParameterTypes = method.getGenericParameterTypes(); if (genericParameterTypes.length > 0) {for (Type type : genericParameterTypes) { map.put(method.getName(), type);} } else {map.put(method.getName(), null); } } return map; } /** * 執行某個方法 * * @param methodName * @param parameters * @return * @throws InvocationTargetException * @throws IllegalAccessException * @throws NoSuchMethodException */ public Object executeMethod(String methodName, Object... parameters) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { ArrayList<Class> paramTypeList = new ArrayList(); for (Object paramType : parameters) { paramTypeList.add(paramType.getClass()); } Class[] classArray = new Class[paramTypeList.size()]; Method method = clazz.getMethod(methodName, paramTypeList.toArray(classArray)); Object invoke = method.invoke(dynamicBean, parameters); return invoke; } /** * 設置屬性值 * * @param property * @param value * @throws NoSuchFieldException * @throws IllegalAccessException */ public void setValue(String property, Object value) throws NoSuchFieldException, IllegalAccessException { Field declaredField = clazz.getDeclaredField('$cglib_prop_' + property); declaredField.setAccessible(true); declaredField.set(dynamicBean, value); } /** * 獲取屬性值 * * @param property * @return * @throws NoSuchFieldException * @throws IllegalAccessException */ public Object getValue(String property) throws NoSuchFieldException, IllegalAccessException { Field declaredField = clazz.getDeclaredField('$cglib_prop_' + property); declaredField.setAccessible(true); Object value = declaredField.get(dynamicBean); return value; } public Object getEntity() { return this.dynamicBean; } /** * 利用cglib的BeanGenerator創建對象 * * @param dynAttrMap * @return */ private Object generateBean(Map dynAttrMap) { BeanGenerator generator = new BeanGenerator(); Iterator iterator = dynAttrMap.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next().toString(); generator.addProperty(key, (Class) dynAttrMap.get(key)); } return generator.create(); }}test.class測試類測試動態生成bean

package com.dym.attr;import com.dym.entity.DynamicBeanEntity;import org.apache.commons.collections.map.MultiValueMap;import java.lang.reflect.InvocationTargetException;import java.util.HashMap;import java.util.Map;/** * @author: zhaoxu * @description: */public class test { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { // 設置屬性們,默認16 HashMap propertyMap = new HashMap(16); propertyMap.put('name', String.class); propertyMap.put('age', Integer.class); propertyMap.put('height', Double.class); // 生成動態 Entity DynamicBeanEntity bean = new DynamicBeanEntity(propertyMap); //設置屬性值 bean.setValue('name', 'zx'); bean.setValue('age', 22); bean.setValue('height', 175.0); //獲取屬性值 Map<String, Object> values = bean.getValues(); //獲取可執行的方法 MultiValueMap methods = bean.getMethods(); //執行某個方法 bean.executeMethod('setAge', 23); System.out.println('動態bean的age屬性:'+bean.getValue('age')); }}test.class測試類測試鏈接數據庫動態生成bean

package com.dym.test;import com.dym.util.DBUtil;import com.dym.util.DynmicEntity;import org.springframework.stereotype.Component;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;/** * @author: zhaoxu * @description: */@Componentpublic class test { public static void main(String[] args) { ArrayList<DynmicEntity> beans = new ArrayList<>(); Connection conn = null; PreparedStatement prst = null; String sql = ''; sql = 'select table_name from information_schema.tables where table_schema=’public’'; conn = DBUtil.getConn(); try { prst = conn.prepareStatement(sql); ResultSet rs = prst.executeQuery(); while (rs.next()) {String tableName = rs.getString(1);Map attrMap = new HashMap<>();String findFieldSql = 'SELECT format_type(a.atttypid,a.atttypmod) as type,a.attname as name, a.attnotnull as notnull n' + 'FROM pg_class as c,pg_attribute as a where c.relname = ’' + tableName + '’ and a.attrelid = c.oid and a.attnum>0';PreparedStatement fieldsPrst = conn.prepareStatement(findFieldSql);ResultSet fieldsRs = fieldsPrst.executeQuery();while (fieldsRs.next()) { String fieldType = fieldsRs.getString(1); String fieldName = fieldsRs.getString(2); attrMap.put(fieldName, Object.class);}DynmicEntity bean = new DynmicEntity(attrMap);beans.add(bean); } } catch (SQLException e) { e.printStackTrace(); } DBUtil.close(prst, conn); }}DBUtil.class:

package com.dym.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;/** * @author: zhaoxu * @description: */public class DBUtil { private final static String URL='jdbc:postgresql://localhost:5432/dynmic'; private final static String NAME='postgres'; private final static String PASS='123456'; private static Connection conn=null; /** * *@Title:DBUtil *@Description: */ public DBUtil(){ } /** * * @Tiltle getConn * @return Connection * @Description:返回連接 */ public static Connection getConn(){ //告訴jvm使用mysql try { //加載驅動,string為驅動名字 Class.forName('org.postgresql.Driver'); //連接數據庫,得到Connection連接 conn=DriverManager.getConnection(URL,NAME,PASS); //System.out.println('連接數據庫: '+conn); }catch(ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } return conn; } //關閉結果對象集 public static void close(ResultSet rs){ if(rs!=null){ try{rs.close(); }catch(SQLException e){e.printStackTrace(); } } } //關閉編譯語句對象 public static void close(PreparedStatement prst){ if(prst!=null){ try{prst.close(); }catch(SQLException e){e.printStackTrace(); } } } //關閉結果對象集 public static void close(Connection conn){ if(conn!=null){ try{conn.close(); }catch(SQLException e){e.printStackTrace(); } } } //對于更新操作關閉資源 public static void close(PreparedStatement prst,Connection conn){ close(prst); close(conn); } //關閉所有 public static void close(ResultSet rs,PreparedStatement prst,Connection conn){ close(rs); close(prst); close(conn); }}

補充:java 反射 json動態轉實體類

我就廢話不多說了,大家還是直接看代碼吧~

package test.refect; public class Student {// 姓名private String name;// 年齡private String age;// 住址private String address; public String getName() {return name;} public void setName(String name) {this.name = name;} public String getAge() {return age;} public void setAge(String age) {this.age = age;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;} @Overridepublic String toString() {return 'Student [name=' + name + ', age=' + age + ', address=' + address + ']';}public void sayHello(Book book){System.out.println(book.getName());}}

package test.refect; public class Book {private String name; public String getName() {return name;} public void setName(String name) {this.name = name;}}

package test.refect; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.net.URLDecoder;import java.util.Iterator; import net.sf.json.JSONObject; public class Main {public static void main(String[] args) throws Exception {//Student str --> Student 主類String str = 'test.refect.Student';Class<?> clazz = Class.forName(str);//Book實體 str --> Book 參數類String bookStr = 'test.refect.Book';Class<?> bookClazz = Class.forName(bookStr);//json --> Book 將參數類轉為JSONOBJECTString bookJson ='{'name':'Java'}'; JSONObject jsonObject=JSONObject.fromObject(bookJson);//實例化參數類Object bookInStance = bookClazz.newInstance();// 通過JSONOBJECT 為參數類賦值Iterator<?> keys = jsonObject.keys(); while (keys.hasNext()) { Object key = keys.next(); Object value = jsonObject.get(key); // 替換非法字符 String _key = String.valueOf(key).replaceFirst('W', ''); Field field = bookClazz.getDeclaredField(_key); field.setAccessible(true); field.set(bookInStance, URLDecoder.decode(String.valueOf(value), 'UTF-8')); field.setAccessible(false); }//將參數類注入到主類 Method method = clazz.getDeclaredMethod('sayHello', bookClazz);//執行主類 method.invoke(clazz.newInstance(), bookInStance); } }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Java
相關文章:
主站蜘蛛池模板: 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 脉冲除尘器,除尘器厂家-淄博机械| 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 苏州西装定制-西服定制厂家-职业装定制厂家-尺品服饰西装定做公司 | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | 喷播机厂家_二手喷播机租赁_水泥浆洒布机-河南青山绿水机电设备有限公司 | 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 酒店品牌设计-酒店vi设计-酒店标识设计【国际级】VI策划公司 | 立刷【微电签pos机】-嘉联支付立刷运营中心| 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 中天寰创-内蒙古钢结构厂家|门式刚架|钢结构桁架|钢结构框架|包头钢结构煤棚 | 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 智能终端_RTU_dcm_北斗星空自动化科技| 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 海外仓系统|国际货代系统|退货换标系统|WMS仓储系统|海豚云 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 |