2013-03-26 79 views
0

我需要將〜20k內置函數和常量從CHM文件填充到列表中。首先我嘗試序列化它們的列表,但反序列化需要1500ms(即使在第一次命中時,快速代碼完成時間也太長)。生成真正大的Java代碼

使用StringTemplate生成有效代碼的試驗代碼生成。但它不會編譯,因爲「initEnums()方法超過了65536的大小限制」。 (和我的Eclipse之後很快死亡)

生成的方法是這樣的:

public XModelField[] initEnums() { 
    return new XModelField[] { 
     new XModelField("aName", "aType", ...), 
     ... 
     // About 4'000 more entries 
    }; 
} 

如果這個限制被限制只到源代碼,我可以用另一個庫直接生成類文件(也許CodeModel )。我想保留我的代碼,如果可能的話,不要再次重寫輸出生成器。有什麼建議麼?

+0

提前解串(和/或積極緩存)怎麼辦? – 2013-03-26 19:02:14

+1

這個約束是類文件的一個約束。源代碼解析器不會在乎任何限制。 – 2013-03-26 19:11:32

+0

@jan已經積極提高啓動和性能。此外,我不希望逆向工程業餘愛好者輕易複製我的數據;類的依賴關係應該暫時將它們放在後面。 我假設CodeModel在方法上沒有這種限制,對吧? – 2013-03-27 09:15:27

回答

1

我認爲你應該重新考慮你的策略。相應地建模您的數據結構和方法,您不必生成代碼。 取而代之的是爲4000個常量生成Java代碼,將數據存儲在一個文件或數據庫中,然後編寫一個簡短方法在初始化時讀取該數據,以填充數據對象的列表。

生成代碼是一個強大的工具,但你應該小心使用它。我沒有看到它對你的用例甚至是必要的,但如果你認爲它是這樣的話,那麼你可以嘗試將代碼生成的部分減到最小以保持簡單。通常,您可以將很多通用代碼提取到抽象超類,以便只需爲子類中的某些方法生成代碼。生成4000個常量的代碼實際上是不必要的。將數據保存爲數據並動態地對數據進行操作。

+0

我使用了ASM框架,但類似的限制約束了類文件。我得到的唯一的錯誤信息就是「方法體太大」。 – 2013-04-04 15:21:57

+0

@ Matej'Yin'Gagyi這是特殊類初始化方法''的方法體,它必須初始化所有類的常量。 – 2013-04-11 20:11:08

+0

@PauloEbermann我從clinit調用初始化每個方法。它不關心你如何構建呼叫。如果一個方法太大,它太大了。 – 2013-04-13 16:56:13