我使用JCodeModel生成Java源,現在想在運行時進行編譯。但我不想將Java文件寫入光盤。在運行時編譯動態生成的類而不寫入文件
據我所見,javax.tools.JavaCompiler(see example)可以進行動態編譯,但看起來我需要這樣的源代碼。
不幸的是我找不到直接從JDefinedClass獲取源代碼的方法。看起來好像我需要將JDefinedClass寫入光盤上的File對象並在之後讀取源文件。
這是真的有必要還是有一些解決方法?
我使用JCodeModel生成Java源,現在想在運行時進行編譯。但我不想將Java文件寫入光盤。在運行時編譯動態生成的類而不寫入文件
據我所見,javax.tools.JavaCompiler(see example)可以進行動態編譯,但看起來我需要這樣的源代碼。
不幸的是我找不到直接從JDefinedClass獲取源代碼的方法。看起來好像我需要將JDefinedClass寫入光盤上的File對象並在之後讀取源文件。
這是真的有必要還是有一些解決方法?
您可以使用下面的代碼,以避免磁盤操作,並在內存中直接寫代碼中使用SingleStreamCodeWriter
:
JCodeModel jCodeModel = createJCodeModel(); // create and prepare JCodeModel
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CodeWriter codeWriter = new SingleStreamCodeWriter(baos);
jCodeModel.build(codeWriter);
String code = baos.toString(); // you can use toString(charset) if there are special characters in your code
謝謝!除了第一行生成外,它的作用就像魅力一樣。它包含諸如「-------完全合格的類名------」之類的東西。可以很容易地被過濾。 – Morrandir
也許你應該嘗試了Javassist或CGLIB? – hoaz
據我所見,CGLIB不再被維護,它似乎很差的文件。事實上,我找不到一個簡單的例子,其中生成了HelloWorld類或其他東西。 Javaassist似乎不提供生成源代碼的可能性,它只是用於操縱字節碼。我需要其他一些原因的源代碼。 – Morrandir
在您提供的文章中有一個'JavaFileObject'的示例實現。它被稱爲'DynamicJavaSourceCodeObject',它將字符串作爲參數。您不需要將其寫入文件進行編譯。只要將它提供給'JavaCompiler' – hoaz