Переопределение публичного финального статического замороженного набора в 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, извлекать объявленные конструкторы / поля / методы, статические или нет, устанавливать их доступными и все остальные вещи, которые вы не должны делать.