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

该博客介绍了如何利用Java动态代理和CGLib库动态生成类的属性,适用于属性数量不确定的情况。通过示例代码展示了如何创建动态Bean和使用反射工具类ReflectUtil动态添加属性及值,最后给出了测试案例。
摘要由CSDN通过智能技术生成

    利用动态代理实现类中属性的动态生成。

    使用场景:当不确定返回类中字段个数时,可使用动态生成属性个数实现需求。

    注意:由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

  1. 引入依赖

<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);}

    返回结果

ab012785f132a17067389fad7d8f06fd.png

    遇到情况:利用 System.out.println(); 打印结果不会显示,只能在调用返回结果时,才会显示动态添加了类属性。

95a9484bbdf18142f5e86ed38769ad33.png

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 动态生成配置可以通过使用 Spring Boot 的 ConfigurationProperties 注解和 Spring 的 Environment 对象来实现。具体步骤如下: 1. 在 application.properties 或 application.yml 文件中定义默认的配置属性。 2. 创建一个 Java ,并使用 @ConfigurationProperties 注解将其与默认配置属性关联起来。在这个中,你可以定义一些属性和方法,用于动态生成配置。 3. 在 Spring Boot 应用程序中,使用 @EnableConfigurationProperties 注解将这个注册为一个 Bean。 4. 在需要动态生成配置的地方,使用 Spring 的 Environment 对象获取配置属性,并根据需要修改它们。 5. 如果需要将修改后的配置保存到文件中,可以使用 Spring 的 ConfigurableEnvironment 对象将其写入到 application.properties 或 application.yml 文件中。 下面是一个简单的示例代码: ``` @Configuration @ConfigurationProperties(prefix = "myconfig") public class MyConfig { private String name; private int age; // getter and setter methods public void updateConfig(Environment env) { this.name = env.getProperty("myconfig.name"); this.age = Integer.parseInt(env.getProperty("myconfig.age")); // modify the configuration properties as needed } } @SpringBootApplication @EnableConfigurationProperties(MyConfig.class) public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @Autowired private MyConfig myConfig; @EventListener(ApplicationReadyEvent.class) public void onApplicationReady() { myConfig.updateConfig(Environment); // use the updated configuration properties } } ``` 在这个示例中,MyConfig 与名为 myconfig 的默认配置属性关联起来。在应用程序启动后,它会从 Environment 对象中获取配置属性,并根据需要修改它们。在 onApplicationReady 方法中,我们可以使用更新后的配置属性来执行一些操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值