annotation processorを作成して、メソッドとフィールドをクラスに挿入しようとしていますが、ドキュメントが非常に疎です。私は遠くに出てこないし、私が正しくそれに近づいているかどうかわからない。注釈プロセッサによるコードの置換
処理環境には、新しいソースおよびクラスファイルを作成するための便利なメソッドを持つFiler
オブジェクトがあります。これらはうまく動作しますが、既存のソースファイルをどのように読み込むかを把握しようとしましたが、そのすべてが "getResource"です。だから私のプロセッサの実装では、私はこれをやった:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
}
}
} catch (Exception e) {
e.printStackTrace();
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
}
return true;
}
私の最初の苦境は、私はelement.asType().toString().replace(".", "/") + ".java"
が(修飾型名を取得し、パッケージとソースファイルパスに変換する)ではないことを感じて助けることができないです問題に近づく良い方法です。 APIの残りの部分は非常に工夫されていますが、元のソースコードを取得するための便利な方法ではないようです。
本当の問題は、コンパイラが出力ディレクトリ( "error:duplicate class")の2番目のソースファイルによって自発的に動揺してしまったことです。
これまでのところ、データの計算とフィールド値とメソッドの挿入のためのマクロ・レクサーとパーサーおよびその他のものは書かれていますが、コンパイラーの外部の初期ステップとして動作します。元のファイルに.java拡張子を付けることができないということを除いて(コンパイラがそれらを見るのを防ぐため)、これはうまく機能します。それから、アノテーションはコード生成を行うことができると聞きましたが、これはより適切で便利なものと思われますが、多くのガイダンスを見つけることはできません。
参照:http://techbitsfromsridhar.blogspot.ca/2013/02/java-compiler-plug-ins-in-java-8-use.html –