2016-04-12 9 views
1

javacコンパイラがアノテーションプロセッサを使用してクラスにメソッドを追加できるかどうかをカスタムアノテーションを作成すると(@SaveFuncName("saveMe")saveMe()というメソッドを追加します)あるいは、別のクラスだけを作成できますか?コンパイル時のアノテーションからクラスにメソッドを追加できますか?

+0

いいえ、不可能です。内部のJavac APIを学ぶなら、構文ツリーを直接変更することは可能ですが、それは心の弱いものではありません。多少の関連性:http://stackoverflow.com/questions/13690272/code-replacement-with-an-annotation-processor最も簡単なことは、例えばスーパークラスを生成することである。 'saveMe()'を呼び出してそれを拡張します。 – Radiodef

+1

@Radiodefありがとうございます。あなたはこれを答えとして掲示することができ、私はそれに答えて印をつけます。 –

答えて

2

他のクラスを作成することはできますか?

これは正しいです。既存のAPIは既存のクラスを変更せず、新しいクラスを生成するだけです。

技術的に言えば、ハッキーなことをやりたいのであれば、内部のJavac APIを使って抽象構文ツリーを直接変更することは可能ですが、それは心の弱いものではありません。たとえば、TypeElementのようなオブジェクトは実際にはJavacからの直接のシンボルであり、インタフェースによって私たちに隠されています。構文ツリーは、compiler tree APIを介して読み取り専用モードでも利用できます。私たちは、インターフェイスをキャストして、そのようにコードを修正することができます。これは、例えばProject Lombokが動作します。

(しかし、私はこれをやってお勧めすることはできません。ロンボクはそれがクラスを変更することは可能であるように見えるように存在するものですので、私はほとんどそれを説明しています。)

最も簡単な解決策は、生成ような何かをしています例えばスーパークラスsaveMe()メソッドを呼び出し、それを拡張するか、ユーティリティクラスを生成してそれに委譲します。 (hereもお勧めします)

+0

オラクルは2017年5月の "Java Magazine"にLombokをフィーチャーしているので、彼らはハッキーなことに賛成しているか、APTに現在のファイルを変更させることを検討しますか? ロンボクはそうしたことをしていたので、記事を読むときに、この質問が私をここにもたらしました。しかし、私はAPT APIにそれを構築するエレガントな方法はないと思うし、とにかくASTを編集する必要があります。 – Stroboskop

+0

@Stroboskop文書化されていないので、ハッキーです。なので、javacのソースコードを読んで、どのように動作するかを理解する必要があります。その記事の著者は、ロンボクが裏で何をしているのか分かりません。ロンボクは、彼らが何を言いたいのかを見たいと思っているならば、それについて自分自身で宣伝しています:http://jnb.ociweb.com/jnb/jnbJan2010.html#controversy個人的には、ASTを修正するか、少なくともメソッドを追加するだけで、しかし、私はそれがすぐに起こるとは思わない。 – Radiodef

関連する問題