当前位置: 首页 > news >正文

【注解】Java自定义注解

目录

1、什么是注解

2、自定义注解的定义

3、使用自定义注解

4、处理自定义注解

 5、注解处理器

5.1、定义注解

5.2、实现注解处理器

6、应用场景

7、总结


 

1、什么是注解

Java注解(Annotation)又称为Java标注,是Java 5开始支持加入源代码的特殊语法元数据。是附加在代码上的一些元信息,可以用于添加元数据、配置或行为到代码中,支持自定义注解,是一个强大的功能,自定义注解的实现包括定义注解、处理注解(通过反射或注解处理器)以及在实际代码中使用注解。注解相关类都包含在java.lang.annotation包中。

2、自定义注解的定义

自定义注解使用@interface关键字定义。常见的自定义注解分为四类,用在类上面、注解用在方法上面、注解用在属性上面、注解用在参数上面,注解可以包含元素(类似于方法),这些元素可以有默认值。

package com.gs.test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//定义注解的作用目标(类,方法,字段等)
@Target(ElementType.METHOD)
//定义注解的生命周期(SOURCE,CLASS,RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
    //定义注解的元素
    String value() default "default value";
    int count();
}
  • @Target:指定注解可以应用的目标(如方法、类、字段等)。常用值:

    • ElementType.METHOD:方法

    • ElementType.TYPE:类或接口

    • ElementType.FIELD:字段

    • ElementType.PARAMETER:参数

  • @Retention:指定注解的生命周期。常用值:

    • RetentionPolicy.SOURCE:仅保留在源码中,编译时丢弃。

    • RetentionPolicy.CLASS:保留到编译后的字节码中,但运行时不可见。

    • RetentionPolicy.RUNTIME:保留到运行时,可以通过反射读取。

3、使用自定义注解

定义好注解后,可以在代码中使用它。

package com.gs.test.annotation;

public class MyService {

    @CustomAnnotation(value = "custom value", count = 3)
    public void myMethod(){
        System.out.println("executing myMethod");
    }
}

4、处理自定义注解

通过反射机制,可以在运行时读取注解信息并执行相应的逻辑。

示例:通过反射读取注解信息

package com.gs.test.annotation;

import java.lang.reflect.Method;

public class AnnotationProcessor {
    public static void main(String[] args) {
        // 获取目标类的Class对象
        Class<MyService> clazz = MyService.class;

        // 遍历类中的所有方法
        for (Method method : clazz.getDeclaredMethods()) {
            // 检查方法是否使用了自定义注解
            if (method.isAnnotationPresent(CustomAnnotation.class)) {
                // 获取注解实例
                CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class);

                // 读取注解的值
                String value = annotation.value();
                int count = annotation.count();

                System.out.println("Method: " + method.getName());
                System.out.println("Value: " + value);
                System.out.println("Count: " + count);

                // 根据注解的值执行逻辑
                for (int i = 0; i < count; i++) {
                    System.out.println("Executing logic based on annotation: " + value);
                }
            }
        }
    }
}

 5、注解处理器

如果需要编译时处理注解,可以使用注解处理器(Annotation Processor)。注解处理器可以生成代码、验证代码或执行其他编译时任务。

示例:实现一个简单的注解处理器

5.1、定义注解

package com.gs.test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)//注解只在源码保留
public @interface GenerateToString {
}

5.2、实现注解处理器

package com.gs.test.annotation;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import java.util.Set;

@SupportedAnnotationTypes("GenerateToString")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class GenerateToStringProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // 处理注解逻辑
        annotations.forEach(annotation -> {
            roundEnv.getElementsAnnotatedWith(annotation).forEach(element -> {
                String className = element.getSimpleName().toString();
                System.out.println("Generating toString() for class: " + className);
            });
        });
        return true;
    }
}

6、应用场景

自定义注解在实际开发中有广泛的应用场景,例如:

  • 框架开发:如Spring中的@Controller@Service等。

  • 代码生成:如Lombok的@Data@Getter等。

  • 验证逻辑:如自定义参数校验注解。

  • 日志记录:通过注解自动记录方法调用日志。

  • 权限控制:通过注解实现方法级别的权限校验。

7、总结

自定义注解的实现包括定义注解、使用注解和处理注解三个步骤。通过反射可以在运行时读取注解信息,而注解处理器可以在编译时处理注解。合理使用自定义注解可以显著提高代码的可读性和可维护性。

 

相关文章:

  • 跟着官方文档学习UE C++ TArray容器系列 迭代
  • Python 3 实用工具库
  • C++基础03(面向对象)
  • 36. 有效的数独
  • 【deepseek】本地部署+webui访问
  • 论文阅读笔记:Continual Forgetting for Pre-trained Vision Models
  • Imagination GPU 3D Graphics Wrokload
  • linux基础语法2
  • 开源文件存储系统
  • 提升数据洞察力:五款报表软件助力企业智能决策
  • 【Mysql】我在广州学Mysql 系列—— 性能优化相关例题
  • 设计模式之代理设计模式
  • nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密
  • Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)
  • 2.26 notes on cxl
  • AI工具库:技术爱好者装备新势能
  • debian 12安装 postgresql 17
  • Idea java项目结构介绍
  • 使用插件 `vue2-water-marker`添加全局水印
  • 拐弯的时间线
  • 银川网站建设多少钱/免费的云服务器有哪些
  • php网站开发步骤/发布软文是什么意思
  • 郑州hi宝贝网站建设公司/专业的seo搜索引擎优化培训
  • 网站建设教程流程图/重庆森林壁纸
  • b2c购物网站有哪些/全国疫情最新情况公布
  • 织梦cms仿网站教程/提高搜索引擎排名