簡體   English   中英

從JSON String創建動態/運行時(和簡單)bean

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

Java以何種方式生成Bean(不僅僅是Map對象) - 一個帶有來自JSON String的字段,getter和setter的bean。

這是我正在嘗試使用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");

但是,由於ByteBuddy的“有線”特性,我不確定從JSON生成動態bean有多靈活。

Byte Buddy是一個通用的類生成工具,當然你可以用它來定義一個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);
}

解決方案是使用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");

這段代碼有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM