Я хочу использовать функцию миксина groovy для импорта методов как «методов класса (статических)» вместо методов экземпляра. Когда я использую миксин, даже если у меня есть статический метод в моем классе миксина, он преобразуется в метод экземпляра в целевом классе. Я хочу, чтобы импортированный метод был методом класса (статическим). Есть ли хороший способ сделать это?
как добавить статические методы с помощью groovy mixin
Ответы (3)
Я не знаю, как добавить статические методы в класс с помощью примесей, но вы можете добавить статические методы в класс через свойство metaClass.static
. Вот пример, который добавляет статический метод fqn()
, который печатает полное имя класса.
Class.metaClass.static.fqn = { delegate.name }
assert String.fqn() == "java.lang.String"
Если вы хотите добавить fqn()
(и другие статические методы) к нескольким классам (например, List, File, Scanner), вы можете сделать что-то вроде
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