广告
返回顶部
首页 > 资讯 > 精选 >如何在java中利用cglib动态生成一个实体bean
  • 653
分享到

如何在java中利用cglib动态生成一个实体bean

2023-06-06 10:06:50 653人浏览 薄情痞子
摘要

如何在java中利用cglib动态生成一个实体bean?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Maven依赖:<dependency>&nbs

如何在java中利用cglib动态生成一个实体bean?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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;public class DynamicBeanEntity {  Object dynamicBean;  Class clazz;  public DynamicBeanEntity(Map dynAttrMap) {    this.dynamicBean = generateBean(dynAttrMap);    clazz = dynamicBean.getClass();  }    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;  }    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;  }    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;  }    public void setValue(String property, Object value) throws NoSuchFieldException, IllegalAccessException {    Field declaredField = clazz.getDeclaredField("$cglib_prop_" + property);    declaredField.setAccessible(true);    declaredField.set(dynamicBean, value);  }    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;  }    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;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;@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;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;    public DBUtil(){  }    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);   } }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何在java中利用cglib动态生成一个实体bean

本文链接: https://www.lsjlt.com/news/246353.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在java中利用cglib动态生成一个实体bean
    如何在java中利用cglib动态生成一个实体bean?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。maven依赖:<dependency>&nbs...
    99+
    2023-06-06
  • 利用Java如何实现一个随机生成动态验证码功能
    利用Java如何实现一个随机生成动态验证码功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言相对来说呢,jpg格式的相对来说容易破解一点,当然也取决于你的干扰元素,元素...
    99+
    2023-05-31
    java 动态 验证码
  • 如何在Java中利用iTextPDF生成一个PDF文件
    这篇文章主要介绍了如何在Java中利用iTextPDF生成一个PDF文件,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-06
  • 如何在Java中利用patchca实现一个验证码生成功能
    本篇文章为大家展示了如何在Java中利用patchca实现一个验证码生成功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码如下: @RequestMapping(value = {"...
    99+
    2023-05-31
    java patchca ava
  • 如何在Java中利用POI生成一个带联动下拉框的excel表格
    本篇文章为大家展示了如何在Java中利用POI生成一个带联动下拉框的excel表格,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体代码如下所示:import java.io.File;import...
    99+
    2023-05-31
    java poi excel
  • 利用java如何实现一个验证码生成功能
    利用java如何实现一个验证码生成功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、serialVersionUID    private...
    99+
    2023-05-31
    java 验证码 ava
  • 利用Java如何获取Mybatis动态生成的sql接口实现
    目录前言1、编写xml: SqlGenarate.mapper.xml2、定义接口3、实现接口总结前言 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 S...
    99+
    2022-11-12
  • 如何在EFCore中与实体Model生成一个SQL Server数据库脚本
    这期内容当中小编将会给大家带来有关如何在EFCore中与实体Model生成一个SQL Server数据库脚本,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  一  代码分析/// &l...
    99+
    2023-06-06
  • 如何在Android应用中实现一个二维码生成功能
    本篇文章为大家展示了如何在Android应用中实现一个二维码生成功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 有自带的jar包可以生成二维码core-3.0.0.jar,其中的c...
    99+
    2023-05-31
    android roi
  • 如何在Android中利用ConstraintLayout实现一个动画效果
    这篇文章将为大家详细讲解有关如何在Android中利用ConstraintLayout实现一个动画效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。xml布局:<!-- activit...
    99+
    2023-05-31
    android constraintlayout roi
  • 如何在Java中利用File类实现一个io编程
    本篇文章为大家展示了如何在Java中利用File类实现一个io编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、首先了解文件流的相关概念:2、文件File类的基本用法public cl...
    99+
    2023-05-31
    java file类 io编程
  • 如何在java项目中利用google的身份验证器实现一个动态口令验证功能
    这篇文章给大家介绍如何在java项目中利用google的身份验证器实现一个动态口令验证功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。google身份验证器的原理是什么呢?客户端和服务器事先协商好一个密钥K,用于一次...
    99+
    2023-05-31
    google ava java
  • 如何在Android应用中利用Dialog实现一个动画效果
    今天就跟大家聊聊有关如何在Android应用中利用Dialog实现一个动画效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 创建两个动画文件window_in.xml:<&a...
    99+
    2023-05-31
    android dialog roi
  • 利用java如何实现一个将中文转换成拼音的功能
    利用java如何实现一个将中文转换成拼音的功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。所需jar:pinyin4j-2.5.0.jarpublic sta...
    99+
    2023-05-31
    java 汉语 拼音
  • 如何在Java中利用字节流实现一个文io编程
    这期内容当中小编将会给大家带来有关如何在Java中利用字节流实现一个文io编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。案例1:演示FileInputStream类的使用(用FileInputStre...
    99+
    2023-05-31
    java io编程 字节流
  • 如何在Java中利用FileUpload实现一个文件上传功能
    如何在Java中利用FileUpload实现一个文件上传功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体方法如下://创建磁盘文件项工厂 DiskFile...
    99+
    2023-05-31
    java fileupload ava
  • 如何在java中利用RandomForest实现一个随机森林效果
    如何在java中利用RandomForest实现一个随机森林效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。随机森林是由多棵树组成的分类或回归方法。主要思想来源于Baggin...
    99+
    2023-05-31
    java randomforest
  • 如何在Java中利用COS实现一个文件上传功能
    如何在Java中利用COS实现一个文件上传功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。cos是O'Rrilly公司开发的一款用于HTTP上传文件的OpenSo...
    99+
    2023-05-31
    cos java ava
  • 如何在Android应用中实现一个动态searchview搜索栏效果
    本篇文章为大家展示了如何在Android应用中实现一个动态searchview搜索栏效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现这个效果, 只要关注几个点搜索栏伸展和收缩动画效果实现2.搜...
    99+
    2023-05-31
    android searchview roi
  • 如何在Android应用中实现一个动态界面分享功能
    如何在Android应用中实现一个动态界面分享功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。动态列表界面MomentListFragment支持 下拉刷新与...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作