javac.exe 内の抽象構文ツリー (AST) にプログラムでアクセスすることはできますか? 例を挙げていただけますか?
2 に答える
はい、可能ですが、Java 6 以降です。Peter von der Ahéがこのインタビューで 2 つの JSR について語っています。JSR 199 の場合:
JSR 199 Compiler API は 3 つの要素で構成されています。次に、API を使用すると、コンパイラがファイルを見つけて書き出す方法をカスタマイズできます。コンパイラが扱うファイルは必ずしもファイルシステム上にあるとは限らないため、抽象的な意味でのファイルを意味します。JSR 199 のファイル抽象化により、データベースにファイルを保持したり、たとえばメモリに直接出力を生成したりできます。最後に、JSR 199 API を使用すると、構造化された方法でコンパイラから診断を収集できるため、たとえばエラー メッセージを IDE のエディタの行に簡単に変換できます。
JSR 269 は、アノテーション処理 API です。
この記事では、コンパイラ ツリー APIへのアクセスの概要を説明しています。「抽象構文ツリーへのアクセス: コンパイラ ツリー API 」セクションは、あなたの質問に特に適しているようです。
何をしているかによっては、コンパイラ ツリーにプラグインするスタンドアロンのリファクタリング エンジンであるJackpot Rule Languageも参照することをお勧めします。
これをコンパイルして実行します(明らかに-cp tools.jar
、の場所を指定する必要があります)。tools.jar
import com.sun.source.util.Trees;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class JCTreeTest {
private static final JavaCompiler javac
= ToolProvider.getSystemJavaCompiler();
public static void main(String[] args) {
final StandardJavaFileManager jfm
= javac.getStandardFileManager(null, null, null);
final JavaCompiler.CompilationTask task
= javac.getTask(null, jfm, null, null, null,
jfm.getJavaFileObjects(args));
final Trees trees = Trees.instance(task);
// Do stuff with "trees"
}
}
コンパイルして実行できますが、私は自分でツリーを操作したことがないので、Javadocを自分で読む必要があります。:-) 幸運を!