7

使用例:
クラス フィールドにカスタム アノテーション @MyContainer を配置し、そのようなすべてのフィールドに関連する Hibernate アノテーションを (フィールド タイプとプロパティに応じて) 自動的に追加します。
さらに、JAXB XmlType アノテーションをクラスに追加し、型名をクラス名に基づいて作成する必要があります。
さらに、タイプなどに基づいてフィールドに注釈を追加したいと思います。追加されたすべての注釈は、実行時に使用できるようにする必要があります (したがって、hibernate / JAXB はそれらを見つけることができます)。
次のオプションを認識しています。

  1. 前処理クラス ソース (不適切なオプション)
  2. javax.annotation.processing API によるコンパイル時の処理
  3. Java Assist などのツールを使用したコンパイル後の操作
  4. java.lang.instrument API を使用したクラスのロード中の操作
  5. AspectJでそれを行う(十分に強力ではありません)

私の主な目標は次のとおりです。

  1. デバッグのためにクラスとソース間の同期を維持する
  2. Maven と IDE (Eclipse / Intellij) の両方からの作業をサポート

すでにそのようなことを行っている人が、そのようなタスク (およびおそらく潜在的な落とし穴) に最適なアプローチを推奨できるかどうかを評価します。

4

5 に答える 5

1

カスタム アノテーションを定義するコード例を次に示します。この @TesterInfo はクラス レベルで適用され、テスターの詳細を保存します。これは、戻り値の型 (e​​num、array、string) のさまざまな使用法を示しています。

package com.mkyong.test.core;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) //on class level
public @interface TesterInfo {

    public enum Priority {
       LOW, MEDIUM, HIGH
    }

    Priority priority() default Priority.MEDIUM;

    String[] tags() default "";

    String createdBy() default "Mkyong";

    String lastModified() default "03/01/2014";

}
于 2015-07-08T22:19:43.230 に答える
0

IDE、コマンドラインビルド、および実行時に最も透過的に機能させるには、オプション1(APTを使用)とオプション5(AspectJを使用)が最適です。

オプション1の場合、独自の@MyContainerアノテーションの存在に基づいて追加のアノテーションを挿入する独自のアノテーションプロセッサを実装する必要があります。これは、同様の何かに使用されるこのアプローチの例です。

オプション5の場合、アノテーション宣言を使用するだけです。このようなもの:

declare @field : * ((@*..MyContainer *)).*(..) : @OtherAnnotation();

SpringのRooツールはオプション5を広範囲に使用しており、十分に強力ではないとは言えません。

于 2012-07-23T18:19:49.280 に答える
0

その上で別のアプローチを提案したいと思います。私の最初の答えは独自のツールのコーディングを伴う可能性があるため、はるかに単純なソリューションを試すこともできます。クラスの単体テストをしているといいのですが、そのようなクラスの単体テストごとに基本クラスを実装できます。この基本クラスには、注釈が付けられたすべてのフィールド@MyContainerに必要な休止状態の注釈もあることを確認するテストメソッドがあります。

基本的に、アノテーションではなくフィールドの直列化可能性について同じことを行い、そのアプローチで非常にうまく機能しました。

于 2012-07-23T07:11:53.367 に答える
0

上記のようにいくつかの選択肢があり、それぞれに長所と短所があります。そのため、上記の質問に対する本当の「正しい」答えはないと思います。私の目的は、コミュニティや、過去にそのようなことをしたことがあり、経験のある人々から意見を聞くことでした. 個人的には、Javassist でInstrument APIを使用することにしました。このようにして、実行時にクラスが拡張されます (ただし、コンパイル後の処理には同じツールを使用できます)。良い点は、JVM 内からエージェントをロードできるため、すべてのコマンド ラインを処理する必要がないことです。他の選択肢について聞くのは素晴らしいことです。
ありがとう、
アヴナー

于 2012-07-27T09:27:47.400 に答える
0

クラスソースの前処理は、あなたの好みの方法だと思います。これにより、ソースをコンパイル済みのクラスと同期させることができます。これは、前述のようにデバッグに適しています。ただし、生成された注釈をチェックインできるため、バージョン管理にも適しています。また、コンパイル中にツールを実行すると、ツールの問題を追跡するのがはるかに難しくなります。また、generate-sources フェーズでコード生成を実行する場合、IDE サポートも問題ありません。

編集:クイック検索により、eclipse jdtまたはnetbeansの何かを使用したプログラムによるJavaソースの変更に関する情報が得られました 。しかし、これはもう少し調査するか、それ自体の問題にする価値があるかもしれません.

于 2012-07-22T20:13:06.650 に答える