|
|
「Java SE 6完全攻略」第93回 プログラムからコンパイル - Compiler API その5先週はJSR 223 Scripting for Java Platformを使用して,Compiler APIを簡単に使う方法を紹介しました。Javaに対応したスクリプトエンジンを使用することで,すべてオンメモリーでソースをコンパイルし,クラスロードまで行うことができます。 今週はこのスクリプトエンジンについて調べることにより,オンメモリーでコンパイル,クラスロードを行う方法を考えてみましょう。 スクリプトエンジンのソース取得スクリプトエンジンについて調べるには,まずそのソースを取得しなくてはなりません。先週,Scripting ProjectからダウンロードしたのはJARファイルだけで,ソースは含まれていませんでした。そこで,ソースをダウンロードしてみましょう。 ソースはScripting ProjectのCVSよりダウンロードできます。詳しくはScripting ProjectのCVSのページをご覧ください。また,このページからソースのブラウズもできます。 Javaのスクリプトエンジンは次の5つのソースファイルから構成されています。
次章からスクリプトエンジンの動作を調べていきましょう。 スクリプトエンジンを調べる上記のクラスの内,JavaScriptEngineFactoryは名前からしても,ファクトリクラスだということがわかります。また,スクリプトエンジンの本体はJavaScriptEngineクラスであることもわかります。 そこで,まず,JavaScriptEngineクラスを見ていきましょう。 先週,紹介したようにスクリプトエンジンでスクリプトを実行するのはevalメソッドです。そこで,まずevalメソッドを見ていくことにします。evalは6種類オーバーロードされていますが,ここでは第1引数がStringクラス,第2引数がjavax.script.ScriptContentクラスのものを示します。
たった2行の単純なメソッドです。はじめにparseメソッドをコールし,戻り値としてClassオブジェクトを取得しています。そして,そのClassオブジェクトを引数にしてevalClassをコールしています。 引数や戻り値から推定すると,parseメソッドがソースをコンパイルし,クラスロードまで行っているようです。そして,evalClassメソッドが引数のClassオブジェクトのmainメソッドを実行していると予想できます。 単純そうなevalClassメソッドから片付けてしまいましょう。
少し長いですが,中心となる部分は単純です。予想したとおり,Classオブジェクトのmainメソッドをコールするためのメソッドだということがわかります。 つまり,青字の部分でClassオブジェクトで表されるクラスのmainメソッドに対応するMethodオブジェクトを取得しています。そして,mainメソッドの引数は,先週紹介したとおりScriptContextオブジェクトに保持させてあるので,オレンジ字の部分でScriptContextオブジェクトのctxより取りだしています。 後は,赤字に示したようにMethodオブジェクトに対してinvokeメソッドをコールしています。Methodクラスのinvokeメソッドの第1引数は,コールするメソッドを持つオブジェクトですが,mainメソッドはstaticメソッドなのでnullになっっています。
>> parseメソッド(前半)
連載新着連載目次へ >>
|