You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java注解类的对应规则是在哪里编写定义的?

Java注解的规则实现逻辑本质

首先明确核心认知:注解本身没有任何执行逻辑,它只是一个带参数的标记,所有规则逻辑全部由对应的解析器实现。


内置注解(以@Override为例)的规则实现

  • @Override的保留策略是SOURCE,仅存在于源码阶段,由编译期处理。
  • 它的覆写校验逻辑完全没有写在注解定义中,而是直接内置在javac编译器的源码里。javac在编译流程的语义检查阶段,会主动扫描所有带@Override注解的方法,匹配当前类的父类、实现接口中是否存在相同方法签名的方法,匹配失败就直接抛出编译错误。

你可以理解为:javac本身预设了对应规则,@Override只是触发这个规则执行的标记而已。


自定义注解的规则实现

你之前查阅的javax.annotation.processing.Processor就是自定义编译期注解的核心解析入口:

  • 自定义编译期注解的所有规则逻辑,全部写在你自己实现的Processor子类中,你需要通过@SupportedAnnotationTypes指定要处理的注解全类名,javac编译时会自动扫描classpath下的所有Processor,把对应注解的语法节点交给你的Processor处理,你可以在process方法中实现任意校验、代码生成等逻辑。
  • 如果是RUNTIME保留级别的注解,规则逻辑就写在自定义的反射处理代码中:比如程序启动时通过反射扫描指定包下的类、方法、字段,判断是否携带目标注解,之后执行你预设的逻辑,Spring中@Autowired的注入逻辑就是按照这个思路实现的。

自定义编译期注解示例

注解定义

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface MyCheck {
}

规则逻辑实现(Processor)

@SupportedAnnotationTypes("com.example.MyCheck")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyCheckProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // 所有自定义规则都写在这个方法内
        // 示例规则:@MyCheck只能标注在单参数方法上,不符合则抛出编译错误
        for (Element element : roundEnv.getElementsAnnotatedWith(MyCheck.class)) {
            if (element.getKind() != ElementKind.METHOD) {
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@MyCheck只能用在方法上");
                return false;
            }
            ExecutableElement method = (ExecutableElement) element;
            if (method.getParameters().size() != 1) {
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "带@MyCheck的方法必须只有1个参数");
            }
        }
        return true;
    }
}

所有注解的规则逻辑,都实现于解析它的代码中,注解本身没有任何执行能力。你觉得这部分是黑盒,只是因为不同注解的解析逻辑实现方不同:JDK内置注解的解析逻辑在javac源码中,框架注解的解析逻辑在对应框架的源码中,自定义注解的解析逻辑在你自己编写的处理代码中。

内容的提问来源于stack exchange,提问作者Rohith Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 23:18:02