0

数週間前、私はJavaクラスのフィールド用にいくつかの文字列定数を作成する方法を探していました-> mavenでクラス属性の定数を生成しますか?

私はそれを働かせました。定数を含むアスペクトを作成し、それらをクラス ファイルに織り込みます。問題は、クライアントが織り込まれたクラスを使用しようとすると NoClassDefFound Exception が発生することです。これには 2 つの理由があります。

  1. ビルド プロセス中にクライアント jar からアスペクト .class ファイルを削除しています

  2. クラスパスにアスペクトライブラリがありません

逆コンパイラを使用して、クラスに次のような静的ブロックがあることがわかりました。

static {
CarDTOAspect.ajc$interFieldInit$my.package.CarDTOAspect$my.package.CarDTO$VENDOR(); 
CarDTOAspect.ajc$interFieldInit$my.package.CarDTOAspect$my.package.CarDTO$NAME();
}

私の質問: クライアント jar の側面を完全に取り除くことができるように、クラス ファイルに実際の "public static final String"-Field を作成するウィーブ プロシージャにオプションはありますか?

前もって感謝します

マーティン

4

1 に答える 1

2

残念だけど違う。これは、AspectJ が行うように設計されたものではありません。型間宣言は、実際にはアスペクトに存在する必要があります (ターゲット型で生成された参照を使用)。これは、スコープ ルールによって、同じ名前の 2 つのフィールドをターゲット タイプに追加できる場合があるためです。例えば:

class C { }
aspect A1 { private int C.field = 9; }
aspect A2 { private String C.field = "what???"; }

これは完全に合法です。内ではどちらのフィールドにもアクセスできませんC。それらは、それらを宣言するアスペクト内でのみアクセスできます。

バイトコード操作を検討している場合は、ASM や Javassist などをお勧めします。

于 2011-04-21T16:13:54.270 に答える