Groovy - 是否可以将 class 作为参数传递?

Groovy - Is it possible to pass a class as a parameter?

这只是我想做的一个非常基本的例子。 foob​​ar 方法中还有更多内容,但这是我正在做的事情的要点。它显然不起作用,因为它无法编译,但我想知道我是否只是错误地传递了 class 或以错误的方式使用了 'className' 参数。我知道我可以修改它以获取 class 名称的字符串并匹配它,但这样做似乎很遗憾。这将是如此美好和干燥。

class Foo {
   String name
}

class Bar {
   String name
}

def foobar(field, className) {
   def instance = className.findByName(jsonParams.field)
   if(!instance) {
      instance = new className(name: jsonParams.field)
   }

   return instance
}

foobar(foos, Foo)
foobar(bars, Bar)

我不太了解 Java 或 Groovy,所以我不确定什么是可能的,什么是不可能的。请随时告诉我 "No." 我试过谷歌搜索,但没有找到任何真正能回答我问题的东西。在这一点上一个简单的不就很好了哈哈。

是的,可以将 class 作为参数传递 - 在 Groovy 中,class 是第一个 class 公民(see this thread for more detail)。

此构造:instance = new className(name: jsonParams.field) 实际上尝试创建名为 className 的 class 的实例,而不是此变量引用的 class 的实例。要使其编译,您需要调用 Class.newInstance:

class Foo {
   String name
}
class Bar {
   String name
}
def foobar(String name,Class clazz) {
   def instance = clazz.findByName(name)
   if(!instance) {
      instance = clazz.newInstance(name:name)
   }

   return instance
}
foobar('foo', Foo)
foobar('bar', Bar)

我不完全确定你想用 findByName 方法实现什么 - 据我所知,FooBar 都没有名为 findByName 的静态方法.