- - PR -
java.lang.Compilerの活用法について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2002-12-03 11:24
プログラム中からコンパイルを行おうとしているものです。
APIドキュメントを検索していましたところ、java.lang.Compilerクラスの compileClass(Class clazz)メソッドにてコンパイルできるようでしたので、 これを利用することにしました。 本当はソースファイルからクラスファイルにコンパイルしたかったのですが、 とっかかりとして、クラスファイルにて早速実験してみました。 しかし、compileClassメソッドはfalseを返してきて失敗に終わりました。 APIドキュメントには、 「Java Virtual Machine は最初の開始時に、システムプロパティ java.compiler があるかどうかを判定します (システムプロパティには、getProperty および System クラスが定義したメソッドからアクセスできる)。 システムプロパティが存在する場合、これは (プラットフォームに依存しない正確な位置と型を持つ) ライブラリ名と仮定されます。」 と記述してありました。 なので、System.getPropertyを調査したところ、 「java.compiler」プロパティを見つけることはできませんでした。 そこで、以下の点が確認したいんですが、 1.「java.compiler」はシステムプロパティに自分で設定するものなのでしょうか? 2.java.lang.Compilerとはクラスファイルをコンパイルするものなのでしょうか? 3.ソースファイルを指定してコンパイルは行えないのでしょうか? 4.根本的に発想が誤っているのでしょうか? 開発環境は、 JDKのバージョン:1.4.0_01-b03 で行っております。 引き続き実験を行いたいと思いますが、何かお気づきになられた方がおられましたら、 ご意見をお願いいたします。 ちなみに私が作成したソースは import java.lang.Compiler; import java.lang.Class; import java.lang.ClassNotFoundException; public class TestCompiler { // ------------------------------ // メイン // ------------------------------ public static void main(String[] args){ if (args.length == 0) return; (new TestCompiler()).startTest(args); } // ------------------------------ // テスト開始 // ------------------------------ private void startTest(String[] args){ boolean b; // パラメータで指定されたクラスファイルをコンパイルします b = compile(args); if (b) { System.out.println("コンパイルは成功しました"); } else { System.out.println("コンパイルは失敗しました"); } } // ------------------------------ // コンパイル // ------------------------------ private boolean compile(String[] args){ boolean b; Class c; try { c = Class.forName(args[0]); System.out.println(c.toString()); b = Compiler.compileClass(c); } catch(ClassNotFoundException e) { // クラスファイルが見つからない場合 e.printStackTrace(); b = false; } return b; } } となっています。 (プレビューで確認もしたんですが、ネストが全部なくなっていて、 非常に見にくいものになってしまってすみません。) 以上です。 | ||||
|
投稿日時: 2002-12-03 11:59
Javaバイトコードをネイティブコードにコンパイルするのがおじゃるまるさんのやりたいことですか? このクラスってソースファイルをjavaバイトコードにコンパイルするのとは全然違う用途ですよ。 独自のJITコンパイラを開発したら役に立つのではないでしょうか。 | ||||
|
投稿日時: 2002-12-03 12:42
http://java-house.jp/ml/archive/j-h-b/029666.html
このメール以下の話が全部理解できるならば、java.lang.Compilerを 使いこなせるかもしれません。 私?もちろん理解できませんよ。 | ||||
|
投稿日時: 2002-12-03 13:17
ひろさん、t-wataさん、返信ありがとうございます。
ひろさんがおっしゃるとおり、「Javaバイトコードをネイティブコードにコンパイルする」 ことが私の目的ではありません。 私の目的は「ソースファイルをjavaバイトコードにコンパイル」だったので、見当違いの クラスについて投稿してしまったわけです。 APIリファレンスをよく読んでいませんでした。すみません。 現在は、Runtimeクラスを使用してjavacにてソースファイルからコンパイルをしてみようと している最中です。 返信ありがとうございました。 | ||||
|
投稿日時: 2002-12-03 14:32
プログラム中で Java のソースをコンパイルするには
com.sun.tools.javac.Main クラスを使用します。 引数は String[] で、javac の引数と同じものを配列にして渡します。 ただし、普通のクラスとは違い、J2SDK をインストールしたディレクト 直下の lib\tools.jar に含まれているので、この JAR ファイルを クラスパスに含める必要があります。 Ant などもこのクラスを使用しているようです。 | ||||
|
投稿日時: 2002-12-03 15:08
さくらばさん、返信ありがとうございます。
そのようなものが存在するんですね。 先ほどの、レスにも書き込みましたが、Runtimeクラスを使用してjavacにパラメータを与えて ソースファイルからコンパイルする事には成功したんですが、 さくらばさんの方法も調べてみます。 ご意見、ありがとうございます。 | ||||
1
