Искам да използвам функцията mixin на groovy за импортиране на методи като "класови (статични) методи" вместо методи на екземпляри. Когато използвам mixin, въпреки че имам статичен метод в моя клас mixin, той се преобразува в метод на екземпляр в целевия клас. Искам импортираният метод да бъде метод на клас (статичен). Има ли добър начин да го направя?
как да добавяте статични методи с помощта на groovy mixin
Отговори (3)
Не знам за някакъв начин за добавяне на статични методи към клас с помощта на миксини, но можете да добавите статични методи към клас чрез свойството metaClass.static
. Ето пример, който добавя статичен fqn()
метод, който отпечатва пълното име на клас
Class.metaClass.static.fqn = { delegate.name }
assert String.fqn() == "java.lang.String"
Ако искате да добавите fqn()
(и други статични методи) към няколко класа (напр. Списък, Файл, Скенер), можете да направите нещо като
def staticMethods = [fqn: {delegate.name}, fqnUpper: {delegate.name.toUpperCase()}]
[List, File, Scanner].each { clazz ->
staticMethods.each{methodName, methodImpl ->
clazz.metaClass.static[methodName] = methodImpl
}
}
person
Dónal
schedule
22.03.2010
Означих с +1 отговора на Дон по-горе.
Ето какво направих, за да заобиколя проблема със статичния миксин със затваряния, които исках да @Mixin.
Class Foo {
static a = {}
static b = {}
static c = {}
}
Class Bar {}
def meths = Foo.metaClass.properties.findAll{it.type==Object}.collect{it.name}
meths.each {Bar.metaClass.static."$it" = A."$it"}
person
virtualeyes
schedule
06.03.2011
Надявам се, че ще бъде възможно в бъдеще, което означава, когато този бъг бъде коригиран: http://jira.codehaus.org/browse/GROOVY-4370 (Смесването на клас със статични методи не работи правилно)
person
Jakub
schedule
23.08.2011