簡體   English   中英

從String動態實例化類的Groovy方法

[英]Groovy way to dynamically instantiate a class from String

關於動態調用靜態方法的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 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 :)

這可以使用底層的GroovyClassLoader

def instance = this.class.classLoader.loadClass( 'Item', true, false )?.newInstance()

我只需要這樣做並找到一種有趣的方式 - 所以我想我會回來提起它。

我有一個問題,因為我想將值傳遞給newInstance(使用非默認構造函數),所有解決方案似乎都有點工作(我很懶,好嗎?)

無論如何,假設你想創建一個新的Integer(5)...試試這個:

c = "java.lang.Integer"
p = "5"
def result = Eval.me("return new ${c}(${p})")
assert(result == 5)

工作得很好,雖然我確信這是最慢的解決方案。 具有該方法適用於許多其他情況的優點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM