javac.exe ASTプログラムによるアクセスの例
-
10-07-2019 - |
質問
javac.exe内の抽象構文ツリー(AST)にプログラムでアクセスすることは可能ですか?例を挙げていただけますか?
解決
はい、可能です。ただし、Java 6以降です。 Peter von der Ah& #233; このインタビューで2つのJSRについて説明しています。 JSR 199の場合:
JSR 199コンパイラAPIは次の3つの要素で構成されています。最初のAPIは、基本的にAPIを介してコンパイラを呼び出すことができます。第二に、APIを使用すると、コンパイラがファイルを見つけて書き出す方法をカスタマイズできます。コンパイラが扱うファイルは必ずしもファイルシステム上にあるとは限らないため、抽象的な意味でのファイルを意味します。 JSR 199のファイルの抽象化により、データベースにファイルを保持したり、出力をメモリに直接生成したりできます。最後に、JSR 199 APIを使用すると、たとえばIDEのエディターでエラーメッセージを簡単に行に変換できるように、構造化された方法でコンパイラーから診断を収集できます。
JSR 269は注釈処理APIです。
この記事は、コンパイラツリーAPI 。セクション" 抽象構文ツリーへのアクセス:コンパイラツリーAPI "あなたの質問に特に適しているようです。
実行内容によっては、ジャックポットもご覧ください。ルール言語。コンパイラツリーにプラグインするスタンドアロンのリファクタリングエンジンです。
他のヒント
-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を自分で読む。 :-)がんばって!