从 JSON 字符串创建动态/运行时(和简单)bean
Create dynamic / runtime (and simple) bean from JSON String
Java 以什么方式可以生成一个 Bean(不仅仅是一个 Map 对象)--一个带有来自 JSON 字符串的字段、getter 和 setter 的 bean。
这是我正在尝试使用 ByteBuddy 的代码(无法正常工作 code/error):
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");
但是,由于 ByteBuddy 的 "wired" 特性,我不确定从 JSON 生成动态 bean 有多灵活。
解决方案是使用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");
此代码有效。
Byte Buddy 是一个通用的class 生成工具,当然你可以使用它来定义一个bean。您只需要遍历您的属性。类似于以下内容:
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());
}
这已成为一个普遍的要求,我已经为下一版本的构建器 API 添加了一个方便的方法:
DynamicType.Builder<?> builder = ...
for ( ... ) {
Class<?> type = ...
String name = ...
builder = builder.definedProperty(name, type);
}
Java 以什么方式可以生成一个 Bean(不仅仅是一个 Map 对象)--一个带有来自 JSON 字符串的字段、getter 和 setter 的 bean。
这是我正在尝试使用 ByteBuddy 的代码(无法正常工作 code/error):
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");
但是,由于 ByteBuddy 的 "wired" 特性,我不确定从 JSON 生成动态 bean 有多灵活。
解决方案是使用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");
此代码有效。
Byte Buddy 是一个通用的class 生成工具,当然你可以使用它来定义一个bean。您只需要遍历您的属性。类似于以下内容:
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());
}
这已成为一个普遍的要求,我已经为下一版本的构建器 API 添加了一个方便的方法:
DynamicType.Builder<?> builder = ...
for ( ... ) {
Class<?> type = ...
String name = ...
builder = builder.definedProperty(name, type);
}