日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态生成类_springboot动态生成类属性

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态生成类_springboot动态生成类属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????利用動態代理實現類中屬性的動態生成。

????使用場景:當不確定返回類中字段個數時,可使用動態生成屬性個數實現需求。

????注意:由于CGLib由于是采用動態創建子類的方法,對于final方法,無法進行代理。

  • 引入依賴

  • <dependency> <groupId>cglibgroupId> <artifactId>cglib-nodepartifactId> <version>3.2.5version>dependency> <dependency> <groupId>commons-beanutilsgroupId> <artifactId>commons-beanutilsartifactId> <version>1.9.3version>dependency><dependency> <groupId>com.google.guavagroupId> <artifactId>guavaartifactId> <version>14.0version>dependency>

    ????2、動態Bean

    public class DynamicBean { private Object target; private BeanMap beanMap; public DynamicBean(Class superclass, Map propertyMap) { this.target = generateBean(superclass, propertyMap); this.beanMap = BeanMap.create(this.target); } public void setValue(String property, Object value) { beanMap.put(property, value); } public Object getValue(String property) { return beanMap.get(property); } public Object getTarget() { return this.target; } /** * 根據屬性生成對象 * */ private Object generateBean(Class superclass, Map propertyMap) { BeanGenerator generator = new BeanGenerator(); if (null != superclass) { generator.setSuperclass(superclass); } BeanGenerator.addProperties(generator, propertyMap); return generator.create(); }}

    ????3、動態工具類 ReflectUtil?

    public class ReflectUtil { private static Logger logger = LoggerFactory.getLogger(ReflectUtil.class); public static Object getObject(Object dest, Map<String, Object> addProperties) { PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean(); PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest); Map<String, Class> propertyMap = Maps.newHashMap(); for (PropertyDescriptor d : descriptors) { if (!"class".equalsIgnoreCase(d.getName())) { propertyMap.put(d.getName(), d.getPropertyType()); } } addProperties.forEach((k, v) -> { String sclass = v.getClass().toString(); if(sclass.equals("class java.util.Date")) {//對日期進行處理 propertyMap.put(k, Long.class); }else { propertyMap.put(k, v.getClass()); } }); DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap); propertyMap.forEach((k, v) -> { try { if (!addProperties.containsKey(k)) { dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k)); } } catch (Exception e) { logger.error("動態添加字段出錯", e); } }); addProperties.forEach((k, v) -> { try { String sclass = v.getClass().toString(); if(sclass.equals("class java.util.Date")) {//動態添加的字段為date類型需要進行處理 Date date = (Date) v; dynamicBean.setValue(k, date.getTime()); }else { dynamicBean.setValue(k, v); } } catch (Exception e) { logger.error("動態添加字段值出錯", e); } }); Object obj = dynamicBean.getTarget(); return obj; }}

    ????4、測試 TEST

    //測試類public?class?User?{ String userName;?????Integer?userAge;}@GetMapping("cglib")public ResultData cglib (){ User user = new User(); Map<String,Object> propertiesMap = new HashMap<String,Object>(); Map<String,Object> hashMap = new HashMap<String,Object>(); for (int i = 0; i < 5; i++) { propertiesMap.put("activity"+i, "活動"+i); } Object obj = ReflectUtil.getObject(user, propertiesMap); return new ResultData().setData(obj);}

    ????返回結果

    ????遇到情況:利用 System.out.println(); 打印結果不會顯示,只能在調用返回結果時,才會顯示動態添加了類屬性。

    總結

    以上是生活随笔為你收集整理的动态生成类_springboot动态生成类属性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。