2014-06-09 22 views
0

我創建了一個非常通用的註釋處理器(例如xjc),它可以掃描我的源並根據它生成額外的類。理想情況下,特定領域的庫應該依賴於註釋處理器庫(它不知道域)。在庫類中的枚舉佔位符

我在註釋處理器中放置的兩個字段是minVersion和maxVersion。該守則將是這個樣子:

@ProcessMe(minVersion=Version.1_3_5, maxVersion=Version.1_5) 
private Foo fieldFoo; 

的目標將是註釋處理器創建一個對象只做特別處理,如果請求的版本是1.3.5和1.5之間。

不幸的是,對於這個工作,註釋處理器需要了解@ProcessMe@ProcessMe需要了解VersionVersion是特定領域。

我最初的想法是,我將有一個版本實現的VersionInfo接口(我需要的是能夠枚舉可能的值並比較它們)。不幸的是,即使VersionInfo擴展了枚舉,我也無法在註釋中指定它,因爲註釋只能包含上述的基元,字符串,類,註釋,枚舉和一維數組。

那麼,任何人都可以想出一種方法來使這項工作不需要註釋處理器具有特定領域的知識(該版本是特定領域的,因爲一個產品可能使用完全不同於其他產品的版本控制方案)。

回答

1

我會建議如下。

將接口ProcessorFilter定義到您的通用庫中。此接口應該看起來像

interface ProcessorFilter { 
    boolean shouldProcess(Element element); 
} 

此處理器的所有實現都在特定於域的庫中完成。

你的情況:

class DomainProcessorFilter { 
    public boolean shouldProcess(Element element) { 
     //returns true if element is annotated with ProcessMe and version is OK 
    } 
} 

你一般圖書館應該發現在類路徑的ProcessorFilter所有實現和運行它們。您可以使用Reflections

+0

嗯......問題是註釋處理器在編譯之前看到代碼,所以即使我找到了ProcessorFilter的一個實例,我也無法實例化它。我想我可以重寫整個apt過程來使用Reflections,並在開始時加載它。另外,我可以有3個庫,通用處理器庫,特定於域的庫以及特定於領域的處理器插件。這給了我一些想法。 – Pace

+0

@Pace,祝你好運。註釋處理的實施是非常艱苦的工作。 – AlexR