2017-02-23 44 views
0

我一直試圖在類加載註釋類型時做一些邏輯。當然靜態塊出現在我的腦海裏。在註釋類型和靜態塊中初始化

但不幸的是,這是不允許的,在Eclipse編譯錯誤是:

Syntax error, insert "enum Identifier" to complete EnumHeader 

我的註釋聲明:

import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 

import java.lang.annotation.Documented; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

@Documented 
@Retention(RUNTIME) 
@Target(FIELD) 
@Validate 
public @interface StringSize { 

int max(); 

int min() default 0; 

    static { 
     Validator.registerCallback(StringSize.class, (Field f, Object parent) -> { 
      Object o = f.get(parent); 
      if(!(o instanceof CharSequence)) 
       throw new IllegalAnnotationException("@StringSize allowed on CharSequence fields only."); 

      CharSequence str = (CharSequence) o; 
      StringSize size = f.getAnnotation(StringSize.class); 

      if(str.length() < size.min()) 
       throw new AssertionError(str + " - length < " + size.min()); 
      if(str.length() > size.max()) 
       throw new AssertionError(str + " - length > " + size.max()); 
     }); 
    } 

} 

我試圖做的是建立一個驗證器經過現場後檢查是否有任何非法值。

現在,這個框架完全不知道什麼被認爲是「非法值」,也就是說,這個框架的任何潛在用戶都可以創建自己的規則,從而創建任意數量的自定義註釋並將其映射到回調方法那確實知道如何驗證它。

@Validate是在驗證框架中用於將註釋標記爲驗證器(類似於CDI的@Qualifier)的自定義元註釋。所有框架的作用是,當調用Validator.validate(obj)掃描所有字段(如果其任何註釋具有元註釋@Validate)時,請查找其相應的回調方法,並使用作爲參數傳遞的字段調用它。回調會在發現任何非法值時拋出異常。

我想找到一個通用的方式來做註釋回調映射,所以最終用戶不應該手動做映射,而是自定義註釋的作者。所以這就是我最終嘗試的。

任何想法如何克服這個約束?

+0

改爲寫一個註釋處理器,把它的語義。 –

+0

您不要在註釋中放入靜態_initializer_塊。 –

+0

@Lew我已經知道了。那麼是否有一個乾淨的選擇,除了讓我的API用戶自己手動進行註冊之外。 – Mordechai

回答

0

這不是真的解決的問題,但是一個不錯的選擇。

在我的文章中,我已經定義了一個元註釋@Validate作爲我的驗證框架的標記。我也有一個接口(lambda表達式實際使用)ValidateCallback

有了這些的地方,我只需要添加一個value()@Validate

public @interface Validate { 
    Class<? extends ValidateCallback> value(); 
} 

現在我可以放下我以前使用的「登記」制度。我只需要調用鏈接的功能界面即可。