2011-06-22 31 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

這是一個使用註釋的人爲的例子,當有更好的習慣用法時「抽象」類的方式。我會發現一個更合適的問題來解決註釋。 –

+0

是的,你說得對。我只是想學習如何使用它,但用例確實不夠。 – Rolf

回答

2

看看使用Java的Proxy類,你CGLIB Enhancer類。這兩種解決方案都允許您代理一個班級並採取任何方法。

+0

感謝您的鏈接。然而,我卻無法理解如何獲得代理實例所需的InvocationHandler。 – Rolf

0

我覺得你這樣做是錯誤的---

但是,如果你真的想在編譯時批註處理來實現這一點,你應該看看Pluggable Annotation Processing API

這是專門爲添加註釋驅動編譯過程的擴展,以執行諸如自動添加方法之類的操作。

+0

Hummm,如果你能更準確地告訴我什麼是錯誤的,我會很高興:) – Rolf

+1

@Rolf - 我不認爲你需要在編譯時添加一個方法 - 我認爲一個常見的繼承或者靜態方法可以在運行時使用註釋數據來做你所需要的。不過,這可能是我低估了問題的複雜性。 – antlersoft

+0

基本上,我只是會使用一個通用的接口或父類,並在那裏定義驗證方法,不需要任何註釋。 關於使用註釋數據的靜態方法,是不是它註解處理器應該做什麼? 這只是我不知道如何完成代碼去上課,並在那裏添加一個方法... 「編譯時間」絕對不是一個義務的方式。 – Rolf

相關問題