2017-04-18 10 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) { 

} 

を渡す前に、アノテーションのパラメータに渡す必要があるが、それを初期化したいクラスが注釈である:@Analyzer(IMPL = StandardAnalyzer <で

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

- I引数、つまり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

*クラス*は初期化しません。インスタンス化*します。つまり、インスタンス(オブジェクト)を作成し、*インスタンス*を初期化します。したがって、渡すものが真のオブジェクトではなくクラスオブジェクトであれば、初期化することはできません。クラスではなくオブジェクトを渡すのはどうですか?コンパイル時にパラメータが何であるか知っていますか? – RealSkeptic

+0

パラメータがあります。Version.LUCENE_32、Collections.EMPTY_SET – fatherazrael

+0

*アナライザ*注釈でクラスに注釈を付ける必要があります。このアノテーション内では、より特殊なアナライザクラスを記述するパラメータを定義します。次に、アノテーションを介してこれらのパラメータにアクセスできます。 – Guybrush

答えて

1

実際にアノテーションに与えられる型は、プリミティブ、String、Class、enum、注釈、および先行する型の配列に制限されています。したがって、ここではストップワードのセットを提供することはできません。ここで参照しているものはコンストラクタであり、コンストラクタはインスタンスを作成します。内部クラスはメソッドと混合されているがあることを、この非常にアプローチに問題がある可能性があり、あなたのコーディングルールに応じて、

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

:しかし、あなたが行うことができ、クラスとして、コンストラクタパラメータを提供することです。だから、あなたはどこかのクラスのクラスを集めることで気分が良くなるかもしれません。もう1つの欠点は、クラスが実際にpublicコンストラクタを持つために公開する必要があることです。

関連する問題