javacコンパイラがアノテーションプロセッサを使用してクラスにメソッドを追加できるかどうかをカスタムアノテーションを作成すると(@SaveFuncName("saveMe")
はsaveMe()
というメソッドを追加します)あるいは、別のクラスだけを作成できますか?コンパイル時のアノテーションからクラスにメソッドを追加できますか?
答えて
他のクラスを作成することはできますか?
これは正しいです。既存のAPIは既存のクラスを変更せず、新しいクラスを生成するだけです。
技術的に言えば、ハッキーなことをやりたいのであれば、内部のJavac APIを使って抽象構文ツリーを直接変更することは可能ですが、それは心の弱いものではありません。たとえば、TypeElement
のようなオブジェクトは実際にはJavacからの直接のシンボルであり、インタフェースによって私たちに隠されています。構文ツリーは、compiler tree APIを介して読み取り専用モードでも利用できます。私たちは、インターフェイスをキャストして、そのようにコードを修正することができます。これは、例えばProject Lombokが動作します。
(しかし、私はこれをやってお勧めすることはできません。ロンボクはそれがクラスを変更することは可能であるように見えるように存在するものですので、私はほとんどそれを説明しています。)
最も簡単な解決策は、生成ような何かをしています例えばスーパークラスsaveMe()
メソッドを呼び出し、それを拡張するか、ユーティリティクラスを生成してそれに委譲します。 (hereもお勧めします)
オラクルは2017年5月の "Java Magazine"にLombokをフィーチャーしているので、彼らはハッキーなことに賛成しているか、APTに現在のファイルを変更させることを検討しますか? ロンボクはそうしたことをしていたので、記事を読むときに、この質問が私をここにもたらしました。しかし、私はAPT APIにそれを構築するエレガントな方法はないと思うし、とにかくASTを編集する必要があります。 – Stroboskop
@Stroboskop文書化されていないので、ハッキーです。なので、javacのソースコードを読んで、どのように動作するかを理解する必要があります。その記事の著者は、ロンボクが裏で何をしているのか分かりません。ロンボクは、彼らが何を言いたいのかを見たいと思っているならば、それについて自分自身で宣伝しています:http://jnb.ociweb.com/jnb/jnbJan2010.html#controversy個人的には、ASTを修正するか、少なくともメソッドを追加するだけで、しかし、私はそれがすぐに起こるとは思わない。 – Radiodef
- 1. コンパイル時にログにクラス名とメソッド名を追加します
- 2. デコレータを使用してコンパイル時にクラスにプロパティを追加できますか?
- 3. Groovy AST - コンパイル時にアノテーションを追加する
- 4. グループにBean検証アノテーションを追加できますか?
- 5. Javaアノテーションを使用してコンパイル時のチェックを定義できますか?
- 6. アノテーション付きのコンテキストに単一のプロパティを追加できますか?
- 7. ArrayListに追加した別のクラスのメソッドを使用できますか?
- 8. ID /クラスをcreateElementメソッドからオブジェクトに追加する
- 9. Stringクラスにcustomizeメソッドを追加することはできますか?
- 10. 実行時にコンパイルされたDLLからリソースを追加および編集できますか?
- 11. C#のクラスに非同期メソッドを追加しますか?
- 12. eclipseに@Atribute(Simple XMLから)アノテーションを追加するには?
- 13. 1点をカラーにし、ggplot2でアノテーションを追加しますか?
- 14. 実行時にクラスにObjective-Cメソッドを追加する
- 15. コンパイル時/ランタイムの追加
- 16. アノテーション付きのメソッドに特定の条件を追加する方法はありますか?
- 17. タイトルにどのようにクラスを追加できますか?
- 18. jQueryクラスの追加を待ってからクラスを追加します
- 19. メソッドにアノテーションを追加するためのaspectj itdの書き方は?
- 20. JavaScript内のメソッド内にオブジェクトを追加できますか?
- 21. メインメソッドまたはメソッド内にActionListener()を追加できますか?
- 22. HTML要素から追加クラスを削除できません。
- 23. Seleniumの@GivenアノテーションにXPathを追加できません
- 24. javaのmain()メソッドからnon-staticクラスにアクセスできますか?
- 25. C#でインターフェイスに動的メソッドを追加できますか?
- 26. Djangoでは、クエリーセットにメソッドを追加できますか?
- 27. コンパイル時に名前がわからないデータフレームに列を追加する
- 28. 実行時に型パラメータのアノテーションにアクセスできますか?
- 29. コードでJavaアノテーションを追加/変更することはできますか?
- 30. Core DataクラスをiOSのフレームワークに追加できますか?
いいえ、不可能です。内部のJavac APIを学ぶなら、構文ツリーを直接変更することは可能ですが、それは心の弱いものではありません。多少の関連性:http://stackoverflow.com/questions/13690272/code-replacement-with-an-annotation-processor最も簡単なことは、例えばスーパークラスを生成することである。 'saveMe()'を呼び出してそれを拡張します。 – Radiodef
@Radiodefありがとうございます。あなたはこれを答えとして掲示することができ、私はそれに答えて印をつけます。 –