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

有没有办法让这个注释自动检查Java方法参数的类型

阎安邦
2023-03-14

@java接口注释。

如果我添加@Target(value=ElementType.METHOD),可以为Java方法导入此注释。

有没有办法让这个注释自动检查Java方法参数类型?

比如,我有一个方法:

    @Annotation(type=Integer)
    sayHello(String name)

一旦我添加了客户注释,它会自动检查sayHello参数类型是否匹配,如果不匹配,将导致编译错误。

它可以实现吗?如果,如何实现?排除在Runtime中使用java Reflect进行检查的想法,这不符合我的想法。

提前致谢。

共有1个答案

能远
2023-03-14

您需要(1)制作自己的注释处理器,其API由JDK的javax.annotation.processingjavax.lang.model包提供,这些包将在编译期间调用并进行必要的检查。(2)使用SPI附加它

(1) 例如,给定注释

package aptest;    
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
public @interface Annotation {
    Class<?> type();
}

注释处理器可能如下所示:

package aptest;
// ... imports
@SupportedAnnotationTypes({"aptest.Annotation"})
public class AnnotationProcessor extends AbstractProcessor 
    implements Processor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv) {        
        for (TypeElement te : annotations) {
              for (Element e : roundEnv.getElementsAnnotatedWith(te)) {
                  // do your checking
              }
        }
        return true;
    }

}

(2)当您打包您的注释处理器(让我们在aptest.jar中说)时,您包含META-INF/services/javax.annotation.processing.Processor文件,其中包含您的注释处理器类的名称:

aptest.AnnotationProcessor

当您编译代码时,将调用注释处理器。要使用它,命令行应如下所示:

javac -cp aptest.jar SayHello.java
 类似资料:
  • 问题内容: 在我的项目中,我们使用了许多批注,这些批注在javadoc API文档中非常有用。 有谁知道在生成的javadocs中包含注释的简单方法?我不想编写自己的javadoc插件。有什么解决办法吗? 问题答案: 参见java.lang.annotation.Documented 表示默认情况下,javadoc和类似工具将记录带有类型的注释。此类型应用于注释其注释会影响其客户端对已注释元素的使

  • 由于没有快速的lambda计算器,我使用上面的策略将非类型化lambda演算的术语编译为Haskell,以便快速计算它们。我对它的性能印象深刻:该程序创建了一个从到的数字列表,并在我的计算机上在不到一秒钟的时间内将它们相加。这比我预期的要快得多--只比Haskell直接等价物慢4倍--并且足以对我的目标有用。但是,请注意,为了满足类型系统的需要,我必须将函数和术语包装在fun/num构造函数下面。

  • 问题内容: 有没有办法使用泛型说“此方法返回”? 当然,我想在子类中重写此方法,因此声明应与一起使用。 这是一个例子: 根本不起作用:我收到“类型不匹配:无法从Base转换为T”。如果我强制使用强制转换,则覆盖将失败。 问题答案: 不,无法表达这一点。只需声明该方法即可返回类的类型。Java具有协变返回类型,因此无论如何您都可以重写方法以返回更特定的类型。 如果您想为此添加一些标记,则可以随时引入

  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 本文向大家介绍数组有没有length()这个方法? String有没有length()这个方法?相关面试题,主要包含被问及数组有没有length()这个方法? String有没有length()这个方法?时的应答技巧和注意事项,需要的朋友参考一下 答:数组没有length()这个方法,有length的属性。String有有length()这个方法。  

  • 我只想使用@scheduler注释定期运行spring boot main方法。我已经指定了一些附加代码,这些代码将在启用REST服务之前执行一些预操作。 我想每10秒运行一次上面的主方法。并在主方法中添加了@时间表注释。但它抛出了一个例外: 根据doc@Scheduler的预期行为应调用一个没有args[]的方法 我想在main方法中使用注释,如下所示: 错误: 组织。springframewo