Groovy - 是否可以将 class 作为参数传递?
Groovy - Is it possible to pass a class as a parameter?
这只是我想做的一个非常基本的例子。 foobar 方法中还有更多内容,但这是我正在做的事情的要点。它显然不起作用,因为它无法编译,但我想知道我是否只是错误地传递了 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
方法实现什么 - 据我所知,Foo
和 Bar
都没有名为 findByName
的静态方法.
这只是我想做的一个非常基本的例子。 foobar 方法中还有更多内容,但这是我正在做的事情的要点。它显然不起作用,因为它无法编译,但我想知道我是否只是错误地传递了 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
方法实现什么 - 据我所知,Foo
和 Bar
都没有名为 findByName
的静态方法.