最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作

 更新時(shí)間:2021年02月19日 08:54:39   作者:旭旭1998  
這篇文章主要介紹了java通過cglib動(dòng)態(tài)生成實(shí)體bean的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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動(dòng)態(tài)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;
  }
  /**
   * 獲取動(dòng)態(tài)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;
  }
  /**
   * 執(zhí)行某個(gè)方法
   *
   * @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;
  }
  /**
   * 設(shè)置屬性值
   *
   * @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創(chuàng)建對(duì)象
   *
   * @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測(cè)試類測(cè)試動(dòng)態(tài)生成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 {
    // 設(shè)置屬性們,默認(rèn)16
    HashMap propertyMap = new HashMap(16);
    propertyMap.put("name", String.class);
    propertyMap.put("age", Integer.class);
    propertyMap.put("height", Double.class);
    // 生成動(dòng)態(tài) Entity
    DynamicBeanEntity bean = new DynamicBeanEntity(propertyMap);
    //設(shè)置屬性值
    bean.setValue("name", "zx");
    bean.setValue("age", 22);
    bean.setValue("height", 175.0);
    //獲取屬性值
    Map<String, Object> values = bean.getValues();
    //獲取可執(zhí)行的方法
    MultiValueMap methods = bean.getMethods();
    //執(zhí)行某個(gè)方法
    bean.executeMethod("setAge", 23);
    System.out.println("動(dòng)態(tài)bean的age屬性:"+bean.getValue("age"));
  }
}

test.class測(cè)試類測(cè)試鏈接數(shù)據(jù)庫(kù)動(dòng)態(tài)生成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:
 */
@Component
public 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 {
      //加載驅(qū)動(dòng),string為驅(qū)動(dòng)名字
      Class.forName("org.postgresql.Driver");
      //連接數(shù)據(jù)庫(kù),得到Connection連接
      conn=DriverManager.getConnection(URL,NAME,PASS);
      //System.out.println("連接數(shù)據(jù)庫(kù): "+conn);
    }catch(ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }catch(SQLException e){
      e.printStackTrace();
    }
    return conn;
  }
  //關(guān)閉結(jié)果對(duì)象集
  public static void close(ResultSet rs){
    if(rs!=null){
      try{
        rs.close();
      }catch(SQLException e){
        e.printStackTrace();
      }
    }
  }
  //關(guān)閉編譯語(yǔ)句對(duì)象
  public static void close(PreparedStatement prst){
    if(prst!=null){
      try{
        prst.close();
      }catch(SQLException e){
        e.printStackTrace();
      }
    }
  }
  //關(guān)閉結(jié)果對(duì)象集
  public static void close(Connection conn){
    if(conn!=null){
      try{
        conn.close();
      }catch(SQLException e){
        e.printStackTrace();
      }
    }
  }
  //對(duì)于更新操作關(guān)閉資源
  public static void close(PreparedStatement prst,Connection conn){
    close(prst);
    close(conn);
  }
  //關(guān)閉所有
  public static void close(ResultSet rs,PreparedStatement prst,Connection conn){
    close(rs);
    close(prst);
    close(conn);
  }
}

補(bǔ)充:java 反射 json動(dòng)態(tài)轉(zhuǎn)實(shí)體類

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

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;
	}
 
	@Override
	public 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實(shí)體 str --> Book 參數(shù)類
		String bookStr = "test.refect.Book";
		Class<?> bookClazz = Class.forName(bookStr);		
		
		//json --> Book    將參數(shù)類轉(zhuǎn)為JSONOBJECT
		String bookJson ="{\"name\":\"Java\"}"; 
		JSONObject jsonObject=JSONObject.fromObject(bookJson);
		
		//實(shí)例化參數(shù)類
		Object bookInStance = bookClazz.newInstance();
		
		// 通過JSONOBJECT 為參數(shù)類賦值
		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);
    }
    
    //將參數(shù)類注入到主類
    Method method = clazz.getDeclaredMethod("sayHello", bookClazz);
    
    //執(zhí)行主類
  	method.invoke(clazz.newInstance(), bookInStance);   	
	} 
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java中值傳遞和引用傳遞的區(qū)別

    Java中值傳遞和引用傳遞的區(qū)別

    這篇文章主要介紹了Java中值傳遞和引用傳遞的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Struts2返回json格式數(shù)據(jù)代碼實(shí)例

    Struts2返回json格式數(shù)據(jù)代碼實(shí)例

    這篇文章主要介紹了Struts2返回json格式數(shù)據(jù)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Spring中@Transactional注解的使用詳解

    Spring中@Transactional注解的使用詳解

    @Transactional注解是Spring提供的一種聲明式事務(wù)管理方式,這篇文章主要為大家詳細(xì)介紹了@Transactional注解的原理分析及使用,需要的可以參考一下
    2023-05-05
  • RequestContextHolder.getRequestAttributes()空指針問題及解決

    RequestContextHolder.getRequestAttributes()空指針問題及解決

    這篇文章主要介紹了RequestContextHolder.getRequestAttributes()空指針問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java使用BeanUtils.copyProperties方法對(duì)象復(fù)制同名字段類型不同賦值為空問題解決方案

    java使用BeanUtils.copyProperties方法對(duì)象復(fù)制同名字段類型不同賦值為空問題解決方案

    這篇文章主要給大家介紹了關(guān)于java使用BeanUtils.copyProperties方法對(duì)象復(fù)制同名字段類型不同賦值為空問題的解決方案,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • 如何讓Spring Rest 接口中路徑參數(shù)可選

    如何讓Spring Rest 接口中路徑參數(shù)可選

    這篇文章主要介紹了如何讓Spring Rest 接口中路徑參數(shù)可選,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 使用Spring Boot的LoggersEndpoint管理日志級(jí)別

    使用Spring Boot的LoggersEndpoint管理日志級(jí)別

    這篇文章主要為大家介紹了使用Spring Boot的LoggersEndpoint管理日志級(jí)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 聊聊Redis二進(jìn)制數(shù)組Bitmap

    聊聊Redis二進(jìn)制數(shù)組Bitmap

    這篇文章主要介紹了Redis二進(jìn)制數(shù)組Bitmap,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案

    Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案

    這篇文章主要介紹了Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • futuretask源碼分析(推薦)

    futuretask源碼分析(推薦)

    這篇文章主要介紹了futuretask源碼分析(推薦),小編覺得還是挺不錯(cuò)的,這里給大家分享下,供各位參考。
    2017-10-10

最新評(píng)論

临夏县| 栖霞市| 潞城市| 新建县| 米林县| 剑川县| 米易县| 务川| 双鸭山市| 永胜县| 沛县| 司法| 阳高县| 垣曲县| 临安市| 外汇| 商都县| 奇台县| 定西市| 肃北| 郁南县| 天峨县| 丰县| 宣汉县| 肇东市| 福泉市| 新营市| 上饶市| 错那县| 湄潭县| 林州市| 玉树县| 江安县| 布拖县| 无锡市| 张家港市| 贞丰县| 滦平县| 孝昌县| 辽阳市| 凯里市|