9

クラスが定数フィールドを定義するとします。

public class Foo {
  public static final int CONSTANT_FIELD = 3;
}

また、アノテーション インターフェイスが次のように宣言されているとします。

public @interface Something {
  int value();
}

最後に、アノテーションが次のように使用されているとします。

@Something(Foo.CONSTANT_FIELD)

質問:CONSTANT_FIELDアノテーション プロセッサで、 の値を設定する際の使用からの要素を取得するにはどうすればよい@Somethingですか?


編集:質問自体に具体的な例を含めます。

次のように使用される注釈があります。

@RuleDependency(recognizer = BQLParser.class,
                rule = BQLParser.RULE_statement,
                version = 0)

注釈プロセッサは、それがクラスRULE_statementで定義された定数であることを認識する必要があります。注釈のプロパティを設定してfor に直接BQLParserアクセスできれば、プロパティは不要になります。この注釈は、実際のアプリケーション内で何千回も使用され、常に定数の型を宣言するだけです。この質問を解決すると、アノテーションの使用法が単純化され、次のようになります。ElementBQLParser.RULE_statementrulerecognizerrecognizerrule

@RuleDependency(rule = BQLParser.RULE_statement, version = 0)
4

2 に答える 2

1

ruleが の場合、アノテーション プロセッサはそれが定義さintれた場所を見つけることができません。intただし、フィールドに の代わりに を使用しenum、パーサーへの参照を使用してルールをグループ化することができます。多分このようなもの:intrule

パーサー インターフェイス:

public interface RuleParser {
}

実装例:

public class RuleParserImpl implements RuleParser {
}

ルール列挙:

public enum Rule {

    RULE_STATEMENT(RuleParserImpl.class);

    private final Class<? extends RuleParser> ruleParserClass;

    private Rule(Class<? extends RuleParser> ruleParser) {
        this.ruleParserClass = ruleParser;
    }

    public Class<? extends RuleParser> getRuleParserClass() {
        return ruleParserClass;
    }
}

int フィールドの代わりに enum を使用した注釈:

@Retention(RetentionPolicy.RUNTIME)
public @interface RuleDependency {
    Rule rule();
}

使用例:

@RuleDependency(rule = Rule.RULE_STATEMENT)
public class RuleProcessor {

    public static void main(String[] args) {
        RuleDependency ruleDependency = RuleProcessor.class.getAnnotation(RuleDependency.class);
        Rule rule = ruleDependency.rule();
        Class<? extends RuleParser> ruleParserClass = rule.getRuleParserClass();
        System.out.println(ruleParserClass); //Prints "class RuleParserImpl"
    }
}

それがあなたにいくつかのアイデアを与えることを願っています。

于 2014-03-14T21:14:05.060 に答える