Переопределение публичного финального статического замороженного набора в Java/Gosu?

У меня есть набор объявленных статических финал и дополнительно заморожен.

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()
}

Тем не менее, пока нет обходного решения. Затем я прочитал, что это возможно через рефлексию.

  • Java Hacks - Changing Final Fields

И тогда я не могу получить доступ к getClass() метод или class член моего типа, ни MyParent "S.

Есть ли обходной путь, который позволил бы мне достичь этого, и как?

Использование Gosu 8.0 в проекте Guidewire.

2 ответа

И потом, я не могу получить доступ ни к методу getClass(), ни к классам моего типа, ни к MyParent.

Это было какое-то время, но я помню, что Gosu/Guidewire определенно поддерживают это. Они просто не имеют того же имени, что и их коллеги по Java.

Вы можете попробовать в Gosu Scratchpad и использовать функцию автозаполнения Guidewire Studio, чтобы найти необходимые методы. Или просто используйте декомпилятор в корневом классе, чтобы увидеть, какую функцию они предоставляют, конечно, среди них есть getClass.

Как сказал Хольгер, использование метода отражения может быть хлопотным и "хакерским". Что ж, я признаю, что делаю это один раз, используя рефлексию, чтобы разработать настраиваемую синхронизацию контактов между Contact Manager и Центром подачи заявок. Это с определенным успехом, хотя время для поддержки этого решения занимает довольно много времени.

Я понимаю, что этот вопрос немного стар, и я использую gw v9, но я обнаружил, что единственный способ использовать отражение в его полном объеме (включая возможность 'setAccessible') в Gosu - это сделать следующее:

var myClass = myObject.Type.getBackingClass()

С этим вы можете продолжать, как в java, извлекать объявленные конструкторы / поля / методы, статические или нет, устанавливать их доступными и все остальные вещи, которые вы не должны делать.

Другие вопросы по тегам