6

生成されたクラスのJavaバイトコードを操作するコンパイル後のステップがあります。私は図書館の消費者の生活をできるだけ苦痛のないものにしたいので、このプロセスを自動化し、(可能であれば)コンパイラに依存しないようにする方法を検討しています。

Annotation Processing APIは、必要な機能の多くを提供します(自動サービス検出、Eclipseでサポート)。残念ながら、これはコードジェネレーターを対象としており、既存のアーティファクトの操作をサポートしていません

ツールへの初期入力は、第0ラウンドによって作成されたと見なされます。したがって、これらの入力の1つに対応するソースファイルまたはクラスファイルを作成しようとすると、FilerExceptionが発生します。

APIが推奨するデコレータパターンはオプションではありません。

ランタイムエージェント/インストルメンテーションを使用してステップを実行する方法はわかりますが、これは手動のビルドステップよりも悪いオプションです。これは、APIに周辺的に触れられた人でも、JVMを非自明な方法で構成する必要があるためです。

javacによって呼び出されるコンパイラツールにプラグインまたはラップする方法はありますか?ドキュメントの内容に関係なく、誰かが注釈プロセッサを破壊してバイトコードを操作することに成功しましたか?

4

2 に答える 2

4

Groovy コンパイラは、コンパイル プロセスにフックできる唯一のバイトコード コンパイラです (例:シングルトン パターンをサポートするバイトコードを生成します) 。

Annotation Processing API は、コードを変更するためのものではありません。すでにわかっているように、できることはクラスローダーをインストールし、実行時にバイトコードを調べて操作することだけです。それは脳死ですが、うまくいきます。これは、Java 全体で見られる一般的な「開発者が何か愚かなことを試みる可能性があることを恐れています」というテーマに従います。javac を拡張する方法はありません。関連するクラスは、private、final、または Java の次のバージョンで変更されます。

もう 1 つのオプションは、注釈付きの Java を記述することです。たとえば、クラス「ExampleTpl.java」を記述します。次に、そのファイル内の注釈を展開して「Example.java」を取得するプリコンパイラを使用します。コードの残りの部分では、 を使用Exampleして無視しExampleTplます。

Eclipse の場合、このステップを自動化するためのバグ レポートがあります。私はこの分野での他の仕事を知りません。

于 2008-12-04T12:36:48.637 に答える
3

それはできます。

コードの書き換えにアノテーション プロセッサが使用されている Java での私のブログ投稿Roman Numerals をご覧ください。Sun の javac のみで動作するという制限があります。

于 2008-12-09T04:58:09.947 に答える