Динамично реализуйте интерфейс в Groovy с помощью invokeMethod

от timocracy.com :

require 'rake'
require 'rake/rdoctask'
require 'rake/testtask'
require 'tasks/rails'

def capture_stdout
  s = StringIO.new
  oldstdout = $stdout
  $stdout = s
  yield
  s.string
ensure
  $stdout = oldstdout
end

Rake.application.rake_require '../../lib/tasks/metric_fetcher'
results = capture_stdout {Rake.application['metric_fetcher'].invoke}

5
задан Daff 19 November 2009 в 18:23
поделиться

2 ответа

Вы можете использовать функцию приведения карты в Groovy для динамического создания карты, которая представляет данный интерфейс:

TestInterface getMapAsInterface() {
  def map = [:]

  TestInterface.class.methods.each() { method ->
    map."$method.name" = { Object[] args-> 
      println "Called method ${method.name} with ${args}" 
    }
  }    

  return map.asType(TestInterface.class)
}
9
ответ дан 14 December 2019 в 01:10
поделиться

Чтобы завершить ответ Кристофа, как указано на этой странице, можно реализовать интерфейс с закрытием. Например:

def map = [doBla: { println 'Bla!'}, hello: {world -> "Hello $world".toString()}] as TestInterface
map.hello 'Groovy' // returns 'Hello Groovy'
0
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: