文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-06 10:25

关注

如何在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);   } }

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯