2011-06-22 10 views
2

私は注釈を覚えて楽しみたい。ここでは私の使用例です:私は、基本的に同じ役割を持つクラスをたくさん持っています:正規表現(1つのメソッド)に対してビデオURLを検証し、対応する埋め込みHTML(別のメソッド)を返します。注釈付きクラスでメソッドを生成する方法は?

検証方法は常に同じです。

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.??) 
@Inherited 
@Documented 
public @interface VideoProvider { 
     String regex(); 
     int group() default 1; 
} 

そのように処理:

//processor class 
public boolean process(Set<? extends TypeElement> annotations, 
     RoundEnvironment roundEnv) { 
    for (TypeElement annotation : annotations) { 
     for (Element e : roundEnv.getElementsAnnotatedWith(annotation)) { 
      if (e.getKind().isClass()) { 
       //????? 
      } 
     } 
    } 
    return false; 
} 
アイデアのようになり

が動的に注釈付きクラスを変更することは、このような注釈を作成することが可能である場合、私はもちろん継承を使用することができますが、私は希望します検証を実行するメソッドを挿入します。 これは実現可能ですか?

ありがとうございます!

ロルフ

+0

クラスにメソッドを追加できます(多くのフレームワークがそうしています)。バイトコードの操作方法については、[javassist](http://www.csg.is.titech.ac.jp/~chiba/javassist/)を参照してください。 – Augusto

+0

これは、アノテーションを使用する際の工夫された例です。 'Abstract'クラスを使います。私は注釈を使って解決するために、より適切な問題を見つけるでしょう。 –

+0

うん、あなたは正しい。私はちょうどそれを使用する方法を学びたいと思ったが、ユースケースは実際には本当に適切ではなかった。 – Rolf

答えて

2

あなたがEnhancerクラスのCGLIB JavaのProxyクラスを使用して見てください。両方のソリューションを使用すると、クラスをプロキシすることができます。

+0

リンクに感謝します。私はしかし、プロキシinstanciationに必要なInvocationHandlerを取得する方法を理解できません。 – Rolf

0

私は

---あなたは間違ってそれをやっていると思います。しかし、あなたが本当にコンパイル時に注釈処理でこれを実装する場合、あなたはPluggable Annotation Processing API

を見なければならない。これは、注釈を追加するための、具体的です自動的にメソッドを追加するなどの作業を行うために、コンパイルプロセスの拡張機能を提供します。

+0

Hummm、何が間違っているかを私に教えてもらえれば嬉しいです:) – Rolf

+1

@Rolf - コンパイル時にメソッドを追加する必要はないと思います。または静的メソッドは、実行時に注釈データを使用して必要な処理を行うことができます。しかし、私は問題の複雑さを過小評価している可能性があります。 – antlersoft

+0

基本的には、共通のインターフェースまたは親クラスを使用して、そこに検証メソッドを定義しました。アノテーションは必要ありません。 注釈データを使用する静的メソッドについては、注釈プロセッサが行うはずのものではありませんか? クラスにアクセスしてメソッドを追加するコードを完成させる方法がわかりません。 「コンパイル時」は絶対に義務ではありません。 – Rolf

関連する問題