接受n个参数的注释

时间:2012-04-16 10:09:55

标签: java annotations

我希望能够使用我想要的参数调用注释,如下所示:

@Authorize("Admin", "Moderator", "User")
public static void read() {
    // ...
}

到目前为止,这是我的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Authorize {
    String[] value() default {};
}

但正如您所知,这只适用于:

@Authorize
@Authorize("Admin")
@Authorize({"Admin", "Moderator", "User"})

事实上,前两个对我来说很好,这是困扰我的最后一个。

原因很简单。

对于权利,我想要一个方法可用于许多个人资料,{}表示“WITH”,我正在寻找“或”;)

(在我看来){}表示“WITH”,因为它“作为一个包”出现。项目链接在一起。例如,如果你这样做:

SomeQuery.select({"A", "B", "C"}, {"D", "E", "F"}, {"G", "H", "I"})

我会将其翻译为:

SELECT WHERE (A, B, C) OR (D, E, F) OR (G, H, I);

(这不是一些SQL查询,只是我看到{}和With / Or的一个例子

谢谢!

3 个答案:

答案 0 :(得分:1)

据我所知,你不能这样做。

获得等效的一种方法是使用例如

@Authorize({"A,B,C", "D,E,F", "G,H,I"})

并在底层实现中,如果您需要具有单独的组件:

String[] component = x.value[idx].split(",");

此处分隔符是逗号,但可以是任何内容,具体取决于您的要求/限制。

问候。

答案 1 :(得分:1)

您可以执行以下操作

public @interface Authorize {
    String[] value();
}

public @interface Packages {
    Authorize[] value();
}

所以你可以拥有

@Packages({
   @Authorize({"A", "B", "C"}),
   @Authorize({"D", "E", "F"}),
   @Authorize({"G", "H", "I"})
})
public void myMethod()

@Authorize({"A", "B", "C"})
public void myMethod2()

(其中第二种形式只是简写:)

@Packages({
   @Authorize({"A", "B", "C"})
})
public void myMethod2()

答案 2 :(得分:1)

真的,它的文档定义了注释的含义,JDK根本就不知道或不关心。如果你正在寻找其他人的两个铜牌,在我第一次阅读你的问题时,我认为这个列表是OR,而不是AND。在任何情况下,如果您想要完全不明确,请以自我记录的方式声明您的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Authorize {
    /**
     * Roles to authorize. By default, any of the roles specified
     * will be accepted as authorization
     */
    String[] value() default {};

    /**
     * Roles to authorize. Any matched role in the list will be accepted
     * as authorization.
     */
    String[] anyOf() default {};

    /**
     * Roles to authorize. All roles in the list must match to be accepted
     * as authorization.
     */
    String[] allOf() default {};
}