[英]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.