2017-04-18 38 views
2

我們有一類我們需要傳遞到標註的參數,但要經過如何在Java註釋中初始化一個類?

public final class StandardAnalyzer extends StopwordAnalyzerBase { 

public static final int DEFAULT_MAX_TOKEN_LENGTH = 255; 
private int maxTokenLength; 
private final boolean replaceInvalidAcronym; 
public static final Set<?> STOP_WORDS_SET; 

public StandardAnalyzer(Version matchVersion, Set<?> stopWords) { 

} 

繼之前初始化它註釋:

@Fields({ @Field(index = Index.YES, store = Store.NO, analyzer = @Analyzer(impl = StandardAnalyzer.class) 

在@Analyzer(IMPL = StandardAnalyzer < - 我想要傳遞參數即標準分析器(版本,停用詞),並且我嘗試過使用新的但未通過。

以下是分析器的註釋詳細信息:

@Retention(value = RetentionPolicy.RUNTIME) 
@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) 
@Documented 
public @interface Analyzer { 
    public Class<?> impl() default void.class; <--- Here is where i want to pass 
    public String definition() default ""; 
} 

在傳入註解之前是否有任何方法來初始化類?

+1

您不初始化* class *。你*實例化*它。也就是說,你創建一個實例(一個對象)並初始化*實例*。所以如果你傳遞的是一個類對象而不是真正的對象,它就不能被初始化。如何傳遞一個對象而不是一個類?你知道編譯時參數是什麼嗎? – RealSkeptic

+0

Yes參數存在,即Version.LUCENE_32,Collections.EMPTY_SET – fatherazrael

+0

您必須使用* Analyzer *註釋來註釋您的類。在此註釋中,您可以定義參數來描述更特殊的分析器類。然後,您可以通過註釋訪問這些參數。 – Guybrush

回答

1

實際上,可以賦予註釋的類型僅限於原始類型,String,Class,枚舉,註釋和前面類型的數組。因此,例如,您無法在此處提供一組停用詞。你在這裏引用的是一個構造函數,一個構造函數將創建實例。但是你可以做的是提供構造函數的參數爲​​一類:

public static class MyAnalyzer extends StandardAnalyzer { 
    public MyAnalyzer() { super(Version.LUCENE_32, Collections.EMPTY_SET); } 
} 
@Fields({ @Field(analyzer = @Analyzer(impl = MyAnalyzer.class) }) 

根據您的編碼規則可能有一個問題,這個非常的辦法,有內部類與方法進行混合。所以也許你可能會在某處收集那種類別感覺更好。另一個缺點是這些類需要公開實際擁有一個公共構造函數。