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

的答案非常有用,但我遇到了以下问题:

我定义了一个简单的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 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)