我已經開始將我的服務器端C#應用程序移植到Java。它所做的一件事就是使用CodeDOM框架動態生成代碼,將其編譯爲字節碼,並在運行時加載類。我們還使用了表達式樹來實現輕量級動態生成方法。在Java中運行時編譯
我做了一些研究,我相信我最接近的是Javaassist。如果有其他支持動態代碼生成和編譯的框架,我將不勝感激。我是Java世界的新兵。
我已經開始將我的服務器端C#應用程序移植到Java。它所做的一件事就是使用CodeDOM框架動態生成代碼,將其編譯爲字節碼,並在運行時加載類。我們還使用了表達式樹來實現輕量級動態生成方法。在Java中運行時編譯
我做了一些研究,我相信我最接近的是Javaassist。如果有其他支持動態代碼生成和編譯的框架,我將不勝感激。我是Java世界的新兵。
還有Java編譯API(例如http://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/)。
如果您只需評估表達式,請考慮任何EL,如OGNL或MVEL。
Groovy,JRuby和Scala是最主流的動態語言,允許從簡單的表達式評估到全面的Java交互等各種選項。
我會看看針對jvm的lisp(或其他動態語言)。 wiki article
要修改類,可以使用javaassit,asm,cglib(實際上取決於asm),bcel等。 其中,我推薦使用asm,因爲它具有更好的輕量級和更好的性能。
使用asm,您可以動態生成一些類。但是,如果要修改在jvm中運行的類,則必須使用Java Instrument API重新轉換已有的類。
你可以看到這篇文章的更多信息。 http://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Aarniala-instrumenting.pdf
更多關於Oracle的文檔。 http://docs.oracle.com/javase/6/docs/technotes/guides/instrumentation/index.html
我已成功使用Janino進行動態代碼生成。像Javassist一樣,它可以在內存中編譯Java源代碼。與Javassist一樣,它也缺少Java 1.5語言功能,但除此之外,它很容易使用。
SimpleCompiler班是一個很好的起點。