2011-06-07 64 views
3

創建新的類有沒有辦法在執行期間創建一個新的java類?所有關於類的信息(名稱,修飾符,方法,字段等)都存在。現在我想創建這個類。一個想法是創建一個新文件並將其寫入該文件,c'est fini!但我認爲有更多優雅的方式可以實現這一點,也許使用JDT?從代碼

+1

你真的需要這個嗎?聽起來有點哈克... – Tobias 2011-06-07 06:45:57

+1

@Tobiask,很多中間件都這樣做。這是相當普遍的任務(簡單情況下JSP就是這樣),需要一些像ASM/BCEL和自定義類加載器的庫,並且完成了。 – bestsss 2011-06-07 06:50:11

+0

@bestsss好吧,謝謝你 – Tobias 2011-06-07 06:51:38

回答

4

要麼使用BCEL創建字節碼和類文件(困難的方式),要麼在內存中創建源代碼並使用Java 6 Compiler API(這就是我所要做的)。但使用Compiler API時,運行應用程序時需要Java SDK,但JRE是不夠的。

進一步閱讀

(目前在網絡上有很多教程)

3

如果您正在編寫一個eclipse插件,並且希望您的工具能夠將代碼生成到項目中,則可以使用AST與JDT進行交互。還有一種方法可以從運行時調用Eclipse批處理編譯器。

AST ast = AST.newAST(AST.JLS3); 
CompilationUnit unit = ast.newCompilationUnit(); 
PackageDeclaration packageDeclaration = ast.newPackageDeclaration(); 
packageDeclaration.setName(ast.newSimpleName("example")); 
unit.setPackage(packageDeclaration); 
ImportDeclaration importDeclaration = ast.newImportDeclaration(); 
QualifiedName name = 
    ast.newQualifiedName(
    ast.newSimpleName("java"), 
    ast.newSimpleName("util")); 
importDeclaration.setName(name); 
importDeclaration.setOnDemand(true); 
unit.imports().add(importDeclaration); 
TypeDeclaration type = ast.newTypeDeclaration(); 
type.setInterface(false); 
type.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD)); 
    type.setName(ast.newSimpleName("HelloWorld")); 
// .... 

囉嗦:-)但是您可以隨時訪問JDT Java核心模型。

如果您需要生成文件到您的eclipse工作區,也有基於模板的選項,如JET

但是,如果你想在Java應用程序運行時動態生成並加載.class文件,請嘗試@Andreas_D建議。