【问题标题】:Groovy - remove class field transient modifier using metaClassGroovy - 使用 metaClass 删除类字段瞬态修饰符
【发布时间】:2012-04-18 14:50:09
【问题描述】:

我们有一个简单的 Groovy 类:

class A implements Serializable {
   transient Integer t // this field is transient in the serialization process
   Object o
}

众所周知,我们可以在运行时使用 Groovy 的 metaClass 属性(元编程)修改类的属性和方法。

我不想做的是:从A类的't'属性中去掉'transient'修饰符,让它序列化这个字段。我需要在运行时使用 metaClass 或其他机制来执行此操作。

重新编译、重新创建 A 类不是解决方案。我已经在服务器上部署并运行了这个类,我唯一​​能做的就是通过远程 groovy-shell 改变它的元行为。

【问题讨论】:

    标签: groovy metaprogramming


    【解决方案1】:

    我已经尝试过了,但我不相信这是可能的

    即使使用反射并在类中声明的字段上设置修饰符,序列化仍然会跳过属性

    我认为唯一的解决方案是编写自己的序列化例程,忽略瞬态修饰符。

    或者当然,换班(但你说这是不可能的)

    【讨论】:

      【解决方案2】:

      如果要控制瞬态字段的序列化,请使用 json-io (https://github.com/jdereg/json-io) Java / Groovy 序列化库。它允许您关联一个类,该类将告诉序列化程序要序列化哪些字段。此列表被指定为字符串列表。换句话说,您可以逐类有效地告诉序列化程序您想要序列化哪些字段。因此,如果您只有一个类导致您出现问题,请指定您想要序列化的字段,包括瞬态字段,它们将被序列化。

      def custom = [(A.class):['t', 'o']]
      def args = [(JsonWriter.FIELD_SPECIFIERS):custom]
      def json = JsonWriter.objectToJson(root, args)
      println json
      

      如果您有多个类需要序列化瞬态字段:

      def custom = [(A.class):['t', 'o'], (B.class):['field1','field2'], ...]
      def args = [(JsonWriter.FIELD_SPECIFIERS):custom]
      def json = JsonWriter.objectToJson(root, args)
      println json
      

      (A.class)在括号中,因为如果 Groovy Map 中的键不是字符串,则需要在括号中。

      【讨论】:

        猜你喜欢
        • 2013-08-28
        • 2011-04-02
        • 1970-01-01
        • 2014-05-12
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多