当前位置:首页 > Java

java 注解如何实现

2026-03-21 16:30:01Java

注解的基本概念

注解(Annotation)是Java提供的一种元数据形式,用于为代码添加标记信息。注解本身不直接影响代码逻辑,但可以通过反射或编译时处理实现特定功能。

定义自定义注解

使用@interface关键字定义注解,并通过元注解(如@Target@Retention)指定其行为:

java 注解如何实现

import java.lang.annotation.*;

@Target(ElementType.METHOD)  // 注解作用目标(方法、类等)
@Retention(RetentionPolicy.RUNTIME)  // 注解保留策略(源码、编译、运行时)
public @interface CustomAnnotation {
    String value() default "default";  // 注解属性,可设置默认值
    int priority() default 1;
}

使用注解

在类、方法或字段上直接添加注解:

java 注解如何实现

public class Example {
    @CustomAnnotation(value = "test", priority = 2)
    public void annotatedMethod() {
        System.out.println("Method with annotation");
    }
}

通过反射处理注解

利用反射机制在运行时读取注解信息并执行逻辑:

import java.lang.reflect.Method;

public class AnnotationProcessor {
    public static void processAnnotations(Object obj) throws Exception {
        Class<?> clazz = obj.getClass();
        for (Method method : clazz.getDeclaredMethods()) {
            if (method.isAnnotationPresent(CustomAnnotation.class)) {
                CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class);
                System.out.println("Found annotation with value: " + annotation.value());
                method.invoke(obj);  // 调用被注解标记的方法
            }
        }
    }
}

编译时注解处理

通过实现AbstractProcessor在编译时生成代码或检查注解:

import javax.annotation.processing.*;
import javax.lang.model.element.*;
import java.util.Set;

@SupportedAnnotationTypes("com.example.CustomAnnotation")
public class CustomAnnotationProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(CustomAnnotation.class)) {
            // 处理注解逻辑,如生成代码或报告错误
            System.out.println("Processed element: " + element.getSimpleName());
        }
        return true;
    }
}

常见元注解说明

  • @Target:指定注解适用的目标类型(如ElementType.METHOD)。
  • @Retention:定义注解生命周期(如RetentionPolicy.RUNTIME)。
  • @Documented:将注解包含在Javadoc中。
  • @Inherited:允许子类继承父类的注解。

实际应用场景

  • 框架集成:Spring的@Autowired、JUnit的@Test
  • 代码生成:Lombok通过编译时注解生成getter/setter。
  • 验证逻辑:自定义注解校验参数合法性。

通过结合反射或编译时处理,注解能显著提升代码的灵活性和可维护性。

分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

如何实现java序列化

如何实现java序列化

实现Java序列化的方法 1. 实现Serializable接口 要使一个类可序列化,需要让该类实现java.io.Serializable接口。这是一个标记接口,没有任何方法需要实现。 publi…

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…

vue如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生滚动 在Vue中可以直接使用HTML原生滚动,通过CSS设置overflow: auto或overflow: scroll来实现滚动效果。适用于简单场景。 <d…

vue如何实现replaceAll

vue如何实现replaceAll

实现字符串全局替换的方法 在Vue中实现类似JavaScript的replaceAll功能,可以通过以下几种方式: 使用String.prototype.replaceAll()(ES2021+)…

vue如何实现筛选

vue如何实现筛选

在Vue中实现筛选功能 Vue提供了多种方式实现数据筛选,可以根据需求选择合适的方法。以下是几种常见的实现方式: 使用计算属性实现筛选 计算属性是Vue中实现筛选功能的推荐方式,它会自动缓存结果,…