0

我有一个声明为静态最终的集合,并且还被冻结了。

class MyParent {
    public final static var MY_FIELDS : Set<MyParent> = {
        FIELD1, FIELD2, FIELD3, FIELD4, FIELD5
    }.freeze()
}

现在,因为从多个位置调用 MyParent.MY_FIELD 来做一些神奇的事情,我希望利用这一点并简单地覆盖集合本身。

class MyChild extends MyParent {
    public override static var MY_FIELDS : Set<MyChild> = {
        FIELD1, FIELD3, FIELD5, FIELD8, FIELD9, FIELD10
    }.freeze()
}

我还尝试使用new在 .NET 中完成的关键字。

class MyChild extends MyParent {
    public new static var MY_FIELDS : Set<MyChild> = {
        FIELD1, FIELD3, FIELD5, FIELD8, FIELD9, FIELD10
    }.freeze()
}

但是,到目前为止还没有解决方法。然后,我读到通过反思是可行的。

然后,我无法访问我的类型的getClass()方法或class成员,也无法访问MyParent

是否有任何解决方法可以让我实现这一目标,以及如何实现?

在 Guidewire 项目中使用 Gosu 8.0。

4

2 回答 2

0

然后,我无法访问 getClass() 方法或我的类型的类成员,MyParent 的也一样。

已经有一段时间了,但我记得 Gosu/Guidewire绝对支持这一点。它们只是与 Java 对应的名称不同。

您可以在 Gosu Scratchpad 中尝试并使用 Guidewire Studio 的自动完成功能来找到必要的方法。或者干脆在根类上使用反编译器来查看它们提供了什么功能,其中肯定有一个getClass

正如 Holger 所说,使用反射方法可能很麻烦且“hacky”。好吧,我承认我曾经这样做过,使用反射在 Contact Manager 和 Claim Center 之间开发定制的 Contact 同步。它取得了一定的成功,尽管支持该解决方案的时间很长。

于 2016-01-19T04:40:44.187 回答
0

我意识到这个问题有点老了,我正在使用 gw v9,但我发现在 Gosu 中使用反射完全扩展(包括能够'setAccessible')的唯一方法是这样做:

var myClass = myObject.Type.getBackingClass()

有了它,您可以像在 java 中一样继续,检索声明的构造函数/字段/方法,无论是否静态,将它们设置为可访问以及所有其他您不应该做的事情。

于 2017-09-15T08:36:07.240 回答