7

アノテーションを作成し、それを DTO に適用して、Java 1.6 スタイルの annotationProcessor を作成しました。私がやりたいことではない、annotationProcessor に新しいソース ファイルを書き込む方法を確認できます。既存のクラスを変更する方法を確認したり見つけたりすることはできません (理想的には、バイト コードを変更するだけです)。変更は実際にはかなり簡単です。プロセッサに実行させたいのは、処理中の注釈の値に由来する名前の新しい getter と setter を挿入することだけです。

私の注釈プロセッサは次のようになります。

@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes({ "com.kn.salog.annotation.AggregateField" })
public class SalogDTOAnnotationProcessor extends AbstractProcessor {

    @Override
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
        //do some stuff
    }
}
4

4 に答える 4

6

AspectJ のようなフレームワークが行う「インストルメンテーション」を探しています。この場合、コマンド ラインで「-agent」オプションを使用して jar を指定する必要があります。その後、ロードされたすべてのクラスをフィルタリングできます。このフィルター ステップでは、注釈を確認し、仮想マシンに読み込まれる前にバイトコードを変更できます。実際のバイトコードの変更を行うためのライブラリには、「asm」と、高レベルのラッパーである「cglib」と「javassist」が含まれます。クラスをプリコンパイルして、インストルメント化する必要があるクラスのリストを生成し、最初のフィルタリングを少し高速化することもできます。

詳細については、java.lang.instrumentation を参照してください。

于 2010-05-04T18:48:45.550 に答える
6

設計上、注釈処理機能では、処理中のソース コードを直接変更することはできません。ただし、処理中のタイプのサブクラスまたは処理中のタイプのスーパークラスを生成できます。計画を立てれば、問題の型を変更する効果の一部が可能になります。これがどのように適合するかの例を書きました。詳細な説明とサンプル コードについては、このブログ エントリを参照してください。

于 2010-04-29T01:46:05.927 に答える
5

内部コンパイラのクラスを使用する必要があります – いくつかのインスピレーション:

しかし、それは瀬戸際です。プログラムは Sun/OpenJDK でのみコンパイルされ、将来のバージョンで問題が発生する可能性があります (内部 API は変更される可能性があります)。一度コンパイルすると、標準のバイトコードになり、どこでも実行されます。

ところで: Eclipse で使用する場合は、Eclipse が非標準のコンパイラを使用するため、特別なサポートを追加する必要があります。設計はより複雑にする必要があり、Lombokのように、プロセッサに抽象化のレベルを追加する必要があります。

于 2012-04-05T16:35:04.183 に答える
-2

これにはコンパイラを拡張する必要がjavacあります。つまり、プログラムのビルドは、通常のアプリケーションほど移植性が高くありません。誰かがこれを達成した方法の詳細については、http://weblogs.java.net/blog/cayhorstmann/archive/2006/06/say_no_to_prope.htmlを参照してください。

于 2010-04-28T08:20:54.823 に答える