JavaBean 動態 新增屬性 動態賦值
阿新 • • 發佈:2022-04-13
/*
*@ClassName JavaFS
*@Description
*@Author LiuQi
*@Date 2022/4/12 11:12 上午
*@Version 1.0
*/
點選檢視程式碼
@ToString @Data public class JavaFS { private String name; private String sex; public static void main(String[] args) throws InstantiationException, IllegalAccessException { JavaFS javaFS = new JavaFS(); Field[] fields = javaFS.getClass().getDeclaredFields(); for (Field declaredField : fields) { declaredField.setAccessible(true); System.out.println(declaredField.getName()); System.out.println(JSON.toJSONString(declaredField)); } System.out.println(javaFS); System.out.println("-----------=======----------========----------"); Map<String, Object> addProperties = new HashMap<>(); addProperties.put("age",18); addProperties.put("email","[email protected]"); javaFS.setName("江小白"); javaFS.setSex("男"); JavaFS fs = (JavaFS) ReflectUtil.getTarget(javaFS, addProperties); Field[] declaredFields = fs.getClass().getDeclaredFields(); for (Field declaredField : declaredFields) { declaredField.setAccessible(true); System.out.println(JSON.toJSONString(declaredField.getName())); } System.out.println(JSON.toJSONString(fs)); } }
點選檢視程式碼
/** * 建立DynamicBean 類 */ @ToString class DynamicBean { /** * 目標物件 */ private Object target; /** * 屬性集合 */ private BeanMap beanMap; public DynamicBean(Class superclass, Map<String, Class> propertyMap) { this.target = generateBean(superclass, propertyMap); this.beanMap = BeanMap.create(this.target); } /** * Bean 新增屬性和值 * * @param property * @param value */ public void setValue(String property, Object value) { beanMap.put(property, value); } /** * 獲取屬性值 * * @param property * @return */ public Object getValue(String property) { return beanMap.get(property); } /** * 獲取物件 * * @return */ public Object getTarget() { return this.target; } /** * 根據屬性生成物件 * * @param superclass * @param propertyMap * @return */ public Object generateBean(Class superclass, Map<String, Class> propertyMap) { BeanGenerator generator = new BeanGenerator(); if (null != superclass) { generator.setSuperclass(superclass); } BeanGenerator.addProperties(generator, propertyMap); return generator.create(); } }
點選檢視程式碼
/** * 建立ReflecUtil轉換的工具類 * 動態生成類的屬性、並且賦值 */ @Slf4j @ToString class ReflectUtil { public static Object getTarget(Object o, Map<String, Object> addProperties) { PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean(); PropertyDescriptor[] propertyDescriptors = propertyUtilsBean.getPropertyDescriptors(o); Map<String, Class> propertyMap = new HashMap<>(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { if (!"class".equalsIgnoreCase(propertyDescriptor.getName())) { propertyMap.put(propertyDescriptor.getName(), propertyDescriptor.getPropertyType()); } } // add extra properties addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass())); // new dynamic bean DynamicBean dynamicBean = new DynamicBean(o.getClass(), propertyMap); // add old value propertyMap.forEach((k, v) -> { try { // filter extra properties if (!addProperties.containsKey(k)) { dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(o, k)); } } catch (Exception e) { log.error(e.getMessage(), e); } }); //add extra value addProperties.forEach((k, v) -> { try { dynamicBean.setValue(k, v); } catch (Exception e) { log.error(e.getMessage(), e); } }); Object target = dynamicBean.getTarget(); return target; } }
注意:這個功能實現 通過 第三方依賴實現 依賴包 如下:
點選檢視程式碼
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId><details>
<version>7.0</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.7.0</version>
<scope>test</scope>
</dependency>
<details>
文件地址:http://cglib.sourceforge.net/apidocs/net/sf/cglib/beans/BeanGenerator.html