如何在Java注释中初始化类?

时间:2017-04-18 09:06:35

标签: java annotations initialization

我们需要将一个类传递给注释参数,但希望在传递

之前对其进行初始化
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&lt; - 我想传递参数,即StandardAnalyzer(版本,停用词),我尝试使用新的但失败了。

以下是Analyzer的注释详细信息:

@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 个答案:

答案 0 :(得分:1)

实际上,可以赋予注释的类型仅限于基元,字符串,类,枚举,注释和前面类型的数组。因此,例如,您无法在此提供一组停用词。你在这里引用的是构造函数,构造函数将创建实例。但你可以做的是提供构造函数参数作为类:

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

根据您的编码规则,这种方法可能存在问题,即内部类与方法混合在一起。所以也许你可能会在某处收集这类课程感觉更好。另一个缺点是类需要public才能实际拥有公共构造函数。