Groovy - 使用metaClass删除类字段瞬态修饰符

时间:2012-04-04 20:37:27

标签: groovy metaprogramming

我们有一个简单的Groovy类:

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

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

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

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

2 个答案:

答案 0 :(得分:0)

我已经开始了,我不相信这是可能的

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

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

当然,改变班级(但你说这是不可能的)

答案 1 :(得分:0)

如果要控制瞬态字段的序列化,请使用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中的键不是String,则它必须在括号中。