java - 如何在 Java 注释中初始化一个类?

标签 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 <- 我想传递参数,即 StandardAnalyzer(Version, stopwords),我尝试使用 new 但失败了。

以下是 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 "";
}

有没有办法在传入注解之前初始化类?

最佳答案

实际上,可以赋予注解的类型仅限于原语、字符串、类、枚举、注解和上述类型的数组。因此,例如,您不能在此处提供一组停用词。您在这里引用的是构造函数,构造函数将创建实例。但是您可以做的是将构造函数参数作为类提供:

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

根据您的编码规则,这种方法可能存在内部类与方法混合的问题。因此,也许您在某个地方收集此类类(class)可能会感觉更好。另一个缺点是这些类需要公开才能真正拥有一个公共(public)构造函数。

关于java - 如何在 Java 注释中初始化一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43467976/

相关文章:

java - Java 中的注解会导致编译时传递依赖吗?

wpf - 控制初始化顺序惨败

java - 如何为我的 Java 程序生成运行时间图

java - 用一个字符替换任何数字序列

java - 改为调用其他方法

javascript - 为什么我收到 "Constructor must be initialized at declaration"google 关闭编译器警告?

swift - UIView 子类在初始化时固定高度

c++ - 不同类型初始化的性能

java - 使用未知数量的 AND 进行 SQL 查询

java - 为什么 EclEmma 不使用 @RunWith(PowerMockRunner.class) 的测试覆盖代码