Java 接受n个参数的注释

Java 接受n个参数的注释,java,annotations,Java,Annotations,我希望能够调用具有任意多个参数的注释,如下所示: @Authorize("Admin", "Moderator", "User") public static void read() { // ... } 到目前为止,我的注释如下: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface Authorize { String[] v

我希望能够调用具有任意多个参数的注释,如下所示:

@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”,我正在寻找一个“OR”;)

(在我看来){}的意思是“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的一个示例)


谢谢

据我所知,你做不到

获得等价物的一种方法是使用

@Authorize({"A,B,C", "D,E,F", "G,H,I"})
在底层实现中,如果需要单独的组件:

String[] component = x.value[idx].split(",");
这里的分隔符是逗号,但可以是任何内容,具体取决于您的要求/限制


问候。

据我所知,你做不到

获得等价物的一种方法是使用

@Authorize({"A,B,C", "D,E,F", "G,H,I"})
在底层实现中,如果需要单独的组件:

String[] component = x.value[idx].split(",");
这里的分隔符是逗号,但可以是任何内容,具体取决于您的要求/限制


问候。

您可以执行以下操作

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()

(其中第二种形式仅为:)


你可以做以下事情

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()

(其中第二种形式仅为:)


实际上,是文档定义了注释的含义,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 {};
}

实际上,是文档定义了注释的含义,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 {};
}

{}表示“WITH”
,您能详细说明一下吗?这取决于实现,它是一个集合,“WITH”或“or”完全取决于开发人员!在您的更新示例中,您强调了我提到的具体实现。
{}表示“WITH”
,您能详细说明一下吗?这取决于实现,它是一个集合,“WITH”或“or”完全取决于开发人员!在您的更新示例中,您强调了我提到的具体实现,我喜欢在子类中拆分权限的想法,因此,您强调了{}并不一定意味着“with”。但我发现这种技术在代码方面更为繁重,我喜欢在子类中拆分权限的想法,因此,您强调了{}并不一定意味着“with”。但我发现这项技术在代码方面更为繁重。这是一个好主意,但如果我想要其他东西(比如枚举),而不是字符串,它会变得更复杂。虽然这仍然是可能的,但我想用一种更简单的方法来做(而不是解析每个字符串,尝试查看它们是否存在于枚举中等等)。这是一个好主意,但是如果我想要别的东西(比如枚举),而不是字符串,那么它会变得更复杂。虽然这仍然是可能的,但我希望使用一种更简单的方法来实现(而不是解析每个字符串,尝试查看它们是否存在于枚举中等等)。这非常有趣!谢谢这很有趣!谢谢