2012-04-30 139 views
2

我有一個庫,允許客戶提供的文本文件,其中每個都包含常規代碼擴展Java類Z.例如文件「A.groovy」一類的列表包含GroovyClassLoader - 添加解析的類類路徑

package com.mypkg; 

public class A extends Z { 

    @Override 
    public void someMethod() { 

     // do something A-ish 

    } 
} 

庫編譯每個這些和(在這種情況下),會返回到客戶端類型Z.的實例

當客戶需要像我的問題來這個:

package com.mypkg; 

public class B extends A {  // extends A! 

    @Override 
    public void someMethod() { 

     // do something B-ish instead of A-ish 

    } 
} 

其中B延伸A和A類是B類前解析

的問題是,GroovyClassLoader似乎無法找到A級,即使它只是解析A.這裏的代碼,編譯腳本和創建實例:

for (String fileName : listOfScriptFiles) { 

     InputStream in = getInputStreamFromFile(fileName); 

     CompilerConfiguration compConfig = new CompilerConfiguration(); 
     GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread() 
      .getContextClassLoader(), compConfig); 

     Z service = null; 

     Class clazz = classLoader.parseClass(in); 
     service = (Z) clazz.newInstance(); 

     return service; 
    } 

是否有「註冊」 A級與運行,這樣當Groovy中嘗試編譯B類也不會抱怨A級不存在呢?

UPDATE

我實際上是能夠通過實例化GroovyClassLoader外循環來解決這個通過客戶端的代碼列表,以便解析的類加載器遍歷是一個分析B.

相同現在的問題仍然有效,不過,因爲我可以在一個完全不同的部分,在相同的類加載器是無法想象其中的某人的代碼的一部分,他們解析的情況下,然後,他們分析B.

+0

你能添加更多的細節你的問題?例如,你不顯示你如何定義變量「in」。 – djangofan

+0

'in'只是列表中的源代碼。澄清了一些背景。 –

+0

您可以添加啓動Groovy腳本的命令嗎? – djangofan

回答

0

以我的經驗與Groovy cla ssloader(這與在這方面Ant和BeanShell中的類加載器的行爲類似),你必須決定了前是否要使用系統默認的類加載器,在這種情況下,你將建立在classpath成啓動Groovy腳本命令另一方面,您只需在命令行classpath中指定groovy jar,然後在自定義類加載器上的Groovy腳本開始處動態添加類。

你是不是在你的問題提供太多的信息,但我的猜測是,你把「A」級的類路徑上,你推出的腳本,然後你嘗試加載類「B」動態前。據我所知,這是行不通的。

注意:我本人一直在試圖找出如何做這種事情。這似乎是可能的,但我仍然沒有想到它。