【问题标题】:How to implement something similar to the @Override java annotation?如何实现类似于@Override java注解的东西?
【发布时间】:2015-06-28 08:22:30
【问题描述】:

使用../java/lang/Override.java中的这个jdk代码,

package java.lang;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)

public @interface Override {
}

只需要注解声明,java 编译器就足够智能地检测错误(编译时):

The method toString123() of type Example must override or implement a supertype method

在下面的问题代码中。

package annotationtype;

public class Example {

    @Override public String toString() {
       return "Override the toString() of the superclass";
    }

    @Override public String toString123() {
       return "Override the toString123() of the superclass";
    }

    public static void main(String[] args) {

    }


}

Override 的注解声明被编译成,

interface java.lang.Override extends java.lang.annotation.Annotation{
}

这只不过是一个interface

所以,

interface java.lang.Override 语法如何帮助 java 编译器在编译时检测到上述错误?

【问题讨论】:

  • 我不明白这个问题。 @Override 注释什么都不做。它只是向编译器表明您打算使用该方法覆盖某些内容。如果没有,编译器就会出错。你似乎已经涵盖了 - 你实际上在问什么?
  • 这是一个完全不同的问题。不是吗?
  • @overexchange 如果这就是你要找的,那你应该问。就目前而言,问题是 interface java.lang.Override 语法如何帮助 java 编译器在编译时检测到上述错误? 而不是 我如何编写自己的自定义注释,如 @Override . 请编辑您的问题以使其清楚。话虽如此,有很多文章已经解释了如何做到这一点。 看我的回答!!
  • 你需要写一个注解处理器,并在编译时让javac运行它。
  • java.lang 包中的注解由javac 直接处理,不使用注解处理器。

标签: java annotations java-8


【解决方案1】:

触发编译错误的实现不在于注解,而在于Java编译器。

如果您想编写自己的类似注解处理器,您可以使用注解处理器 API:http://docs.oracle.com/javase/7/docs/api/javax/annotation/processing/Processor.html

【讨论】:

  • 如果我需要声明我自己的 @interface Ioverride 以在编译时检查覆盖,我该怎么做?
  • @overexchange 他刚刚回答了这个问题。
  • @overexchange 这个答案几乎涵盖了您问题的两个部分。如果您想要详细的示例,请查看我对互联网上一些相关文章的回答..
【解决方案2】:

这不过是一个界面。

所以,

接口 java.lang.Override 语法如何帮助 java 编译器 在编译时检测到上述错误?

没错。 Override 只不过是一个接口。实际工作由 java 编译器完成。未指定编译器如何执行此操作。

这里有一些链接解释了如何使用AnnotationProcessor 来实现类似于@Override 的东西:

  1. Processor Java doc
  2. Java annotation processing tool
  3. Code generation using AnnotationProcessor
  4. Annotation Processor, generating a compiler error
  5. Source code analysis using Java 6 API
  6. Playing with Java annotation processing

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2013-05-08
    • 2015-06-04
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多