そんなときは、Java 6のjavax.tools.JavaCompilerというクラスがお役に立ちます。やり方は以下の通りです。
- 文字列(StringBuffer、byte array、CharSequenceなど)のJavaコードを作成します
- コードをコンパイルしてクラスにします
- コンパイルしたコードをClassLoaderでロードすると、クラスパスに登録されます
- 生成したクラスを実行します
しかしまだるっこしい制約があります。JavaCompilerはカスタムClassLoaderを用いることができません。つまり動的コンパイルで生成されたクラスは他のクラスの動的コンパイルのために利用できないということです。
これは、例えば、ClassAクラスを作成して、ClassAクラスを拡張したClassBクラスを生成してロードした場合、ClassBクラスをコンパイルするとClassAがない、というClassNotFoundExceptionを吐く、ということです。
この問題は、ASMのようなライブラリを使ってJVMバイトコードを生成すれば回避できますが、この回避策を使うと、JavaとJVMバイトコードは全く異なる言語であるがために、デバッグがやや難しくなってしまいます。
原文はこちら。
http://blogs.oracle.com/ateamsoab2b/entry/dynamic_java_compilation
0 件のコメント:
コメントを投稿