Groovy从字符串动态实例化类的方法
的答案非常有用,但我遇到了以下问题: 我定义了一个简单的Groovy类:Groovy从字符串动态实例化类的方法,groovy,Groovy,的答案非常有用,但我遇到了以下问题: 我定义了一个简单的Groovy类: class Item { def id = 1 def data = [ "a", "b" ] } 然后,我定义了一个简单的实用程序类,它希望动态加载Item类: class Util { static def main(args) { def cls = "Item" as Class def instance = cls.newInstance() println insta
class Item {
def id = 1
def data = [ "a", "b" ]
}
然后,我定义了一个简单的实用程序类,它希望动态加载Item类:
class Util {
static def main(args) {
def cls = "Item" as Class
def instance = cls.newInstance()
println instance.toString()
}
}
Util.groovy与Item.groovy位于同一文件夹中
尝试运行Util.groovy时,出现以下错误:
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
Cannot cast object 'Item' with class 'java.lang.String'
to class 'java.lang.Class' due to:
java.lang.ClassNotFoundException: Item
at Util.main(Util.groovy:3)
我能让它工作的唯一方法是使用groovyc预编译Item.groovy,但这忽略了作为groovy的意义:)这可以工作,使用:
我不得不这么做,并找到了一个有趣的方法——所以我想我应该回来提一下 我有一个问题,因为我想把一个值传递给newInstance(使用一个非默认构造函数),而所有的解决方案似乎都需要一点工作(我很懒,好吗?) 无论如何,假设您想要创建一个新的整数(5)。。。试试这个:
c = "java.lang.Integer"
p = "5"
def result = Eval.me("return new ${c}(${p})")
assert(result == 5)
虽然我确信这是可能的最慢的解决方案,但效果非常好。该方法的优点是适用于许多其他情况。您可能应该将
this.class
更改为this.getClass()
。通常建议使用完整的方法来避免。当我们知道这不是地图时,为什么还要麻烦呢?拥抱动态!;-)您还可以以3种不同的形式直接向newInstance()提供构造函数参数:map、array或comma lista:@Bill在知识层面上似乎很有趣,但这并不是groovy的方式,就像Abdennour TOUMI saidI一样,刚才提到它是为了完整性和简单性——有时候你只是在写一个一次性的脚本,这很容易记住,也很灵活。
c = "java.lang.Integer"
p = "5"
def result = Eval.me("return new ${c}(${p})")
assert(result == 5)