简体   繁体   English

从JSON String创建动态/运行时(和简单)bean

[英]Create dynamic / runtime (and simple) bean from JSON String

In what way can Java generate a Bean (not just a Map object)--a bean with fields, getters, and setters from a JSON String. Java以何种方式生成Bean(不仅仅是Map对象) - 一个带有来自JSON String的字段,getter和setter的bean。

Here's the code I am trying now using ByteBuddy (non-working code/error): 这是我正在尝试使用ByteBuddy的代码(非工作代码/错误):

        Object contextObject = new ByteBuddy()
            .subclass(Object.class)
            .defineField("date", String.class, Modifier.PUBLIC)
            .defineMethod("getDate", Void.TYPE, Modifier.PUBLIC)
            .intercept(FieldAccessor.ofField("date"))
            .make()
            .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
            .getLoaded()
            .newInstance();
        BeanUtils.setProperty(contextObject, "date", "August 1, 2017");

However, due to the "wired" natured for ByteBuddy, I am not sure how flexible it can be to generate a dynamic bean from JSON. 但是,由于ByteBuddy的“有线”特性,我不确定从JSON生成动态bean有多灵活。

Byte Buddy is a generic class generation tool, of course you can define a bean using it. Byte Buddy是一个通用的类生成工具,当然你可以用它来定义一个bean。 You just need to loop over your properties. 您只需要遍历您的属性。 Something like the following: 类似于以下内容:

DynamicType.Builder<?> builder = ...
for ( ... ) {
  Class<?> type = ...
  String name = ...
  builder = builder.defineField(name, type, Visibility.PRIVATE)
                   .defineMethod("get" + name, type, Visibility.PUBLIC)
                   .intercept(FieldAccessor.ofBeanProperty())
                   .defineMethod("set" + name, void.class, Visibility.PUBLIC)
                   .withParameters(type)
                   .intercept(FieldAccessor.ofBeanProperty());
}

This has become such a common request that I have added a convenience method to the builder API for the next release: 这已经成为一种常见的请求,我在下一个版本的构建器API中添加了一个方便的方法:

DynamicType.Builder<?> builder = ...
for ( ... ) {
  Class<?> type = ...
  String name = ...
  builder = builder.definedProperty(name, type);
}

The solution is to use https://github.com/cglib/cglib : 解决方案是使用https://github.com/cglib/cglib

        BeanGenerator beanGenerator = new BeanGenerator();
        beanGenerator.addProperty("date", String.class);
        Object myBean = beanGenerator.create();
        Method setter = myBean.getClass().getMethod("setDate", String.class);
        setter.invoke(myBean, "August 1, 2017");

This code works. 这段代码有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM