2017-01-31 38 views
1

我有一個程序使用JCodemodel和動態類加載器來生成類。我解析一個yaml文件,生成所需的類並映射文件的結構。目前一切都很好。系統類加載器不使用重寫方法

Snakeyaml處理解析和寫得很好,所以類的定義如果罰款。

然後我嘗試訪問在yaml中重新定義的屬性()的方法。我首先加載文件到一個「樹」,加載它的根元素作爲「計算」,並打印它的類和方法;然後我調用重寫的方法。 computeb類是動態生成的,以及computeb $屬性

這裏是代碼(我換成短的我的包):

Tree tree = Parser.load(new FileInputStream("src/test/resources/tree.yaml")); 
mypackage.Compute c = (mypackage.Compute) tree.root(); 
System.err.println("class : " + c.getClass()); 
for (Method m : c.getClass().getMethods()) { 
    System.err.println(" method : " + m); 
} 
System.err.println("properties() class is " + c.properties().getClass().getName()); 

結果是:

類:類computeb
方法:公共computeb $物業computeb.properties ()
方法:public mypackage.Compute $屬性mypackage.Compute.properties()
(...)
properties( )class is mypackage.Compute $ Property

正如您所看到的,該類有兩個存在的方法,但是所調用的properties()方法是第二個方法。我想調用第一個(在類加載器中定義的)。爲什麼會發生這種情況?我該怎麼辦 ?

+1

看起來像'c.properties()'返回'mypackage.Compute $ Property'的對象。你有沒有嘗試調用'c.properties()。properties()'? –

+1

Compute $ Propertiy沒有property()方法。 – guigolum

回答

0

好的我知道了,我在靜態生成特定文件夾上的類時遇到了問題。

因爲我必須解決現有的類以避免創建兩次,所以我只解決了以我的包前綴開頭的類。

這在靜態生成中運行良好,但在動態生成中,我以前生成的類無法加載,但它們已經存在。基本上這意味着我的類生成器正在創建另一個具有相同名稱的類,所以有時類加載器可能會引用一個類,有時會引用另一個類。

我正在糾正這髒亂。

相關問題