当前位置: 首页 > 知识库问答 >
问题:

如何扩展Java注释?

师博
2023-03-14

在我的项目中,我使用预定义的注释@with

@With(Secure.class)
public class Test { //....

@with的源代码

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface With { 

    Class<?>[] value() default {};
}

我想编写自定义注释@Secure,它将与使用(Secure.class)的@具有相同的效果。怎么做?

如果我真的喜欢这个呢?行吗?

@With(Secure.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

共有3个答案

王景山
2023-03-14

进一步阐述穆罕默德·阿卜杜拉赫曼的回答--

@With(Secure.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

默认情况下,这不起作用,但您可以将其与Spring的AnnotationUtils结合使用。

请参见此答案以获取示例。

贝凯
2023-03-14

来自Java语言规范,第9.6章注释类型:

不允许使用扩展条款。(注释类型隐式扩展注释。注释

所以,你不能扩展一个注释。你需要使用一些其他的机制或者创建一个代码来识别和处理你自己的注释。Spring允许您在自己的自定义注释中对其他Spring的注释进行分组。但是,仍然没有扩展。

袁法
2023-03-14

正如piotrek指出的,您不能从继承的角度扩展注释。不过,您可以创建注释来聚合其他注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SuperAnnotation {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SubAnnotation {
    SuperAnnotation superAnnotation();
    String subValue();
}

用法:

@SubAnnotation(subValue = "...", superAnnotation = @SuperAnnotation(value = "superValue"))
class someClass { ... }
 类似资料:
  • 问题内容: 我必须在Web应用程序中使用3个不同的事务管理器。因此,我根据Spring参考(第10.5.6.3节“自定义快捷方式注释”)编写了自己的注释。 一个注释(用于使用一个特定的transactionmanager)如下所示: 使用自定义的@CustomerTX批注对我的服务层进行批注时,一切工作正常。但是我必须为注释提供更多选项,例如readonly = true,rollbackFor

  • Extensions can be registered declaratively via @ExtendWith, programmatically via @RegisterExtension, or automatically via Java’s ServiceLoader mechanism. 5.2.1. Declarative Extension Registration Deve

  • 问题内容: 我正在尝试扩展Python,以用于越野比赛的结果。我想从格式为string的对象构造一个对象。我可以使用工厂设计模式和注释来完成此操作。我将如何通过覆盖和/或完成相同的任务? 使用下面的代码,构造一个对象会引发TypeError。请注意,未调用,因为未打印。 这是错误: 如果将代码从移至,则会得到以下结果。注意这次,输出显示我的函数被调用了。 问题答案: 显然,对象是不可变的,这意味着

  • 这是我现在面临的问题。我有一个类,假设 ,这个类定义了一个名为 的方法,该方法返回一个 实例。类 在 内部定义,并被声明为。我想做的是定义一个扩展的类,但我也我自己的功能(方法,属性等)来扩展。我也希望返回。 问题是< code>Bar是最终的。下面是我想做的一个例子: 我想做的是: 我怎样才能做到这一点? [编辑]我正在为我的问题添加更多详细信息。我实际上正在为 Jenkins 开发一个插件,搜

  • 我有以下类 : 我想按如下方式使用它: 因此,通过扩展已经注入依赖项的超类,我希望在其子类中访问它。 我尝试了许多不同的方法,甚至将超类作为组件: 但是,<code>仍然是这样。fetchApi为,即使在超类中也是如此。

  • 问题内容: 我有两个字符串: 我通过反思上课 我想要aClass扩展b,例如: 如何实现呢? 如何获得okClass? 谢谢! 问题答案: 除了使用仅通过接口工作的JDK动态代理外,您还可以使用CGLIB或javassist在运行时扩展类。