【Java 注解】自定义注解 ( 注解属性定义与赋值 )

简介: 【Java 注解】自定义注解 ( 注解属性定义与赋值 )

文章目录

一、自定义注解格式

二、注解本质分析

三、注解属性及类型

四、注解属性类型

五、注解属性赋值简化操作





一、自定义注解格式


分析 Java 中自带的 @Override 注解 , 源码如下 :


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



注解分为两部分 :


① 元注解 ;


② public @interface 注解名称 ;






二、注解本质分析


按照 public @interface 注解名称 格式 , 写出一个注解 , 编译该注解代码生成 Annotation.class 字节码文件 ;


public @interface Annotation {
}


使用 javap 命令反编译Annotation.class 字节码文件 , 查看该注解的实际代码 ;


反编译命令如下 :


javap Annotation.class


输出内容 :


D:\002_Project\004_Java_Learn\Annotation\out\production\Annotation>javap Annotation.class
Compiled from "Annotation.java"
public interface Annotation extends java.lang.annotation.Annotation {
}





注解的本质是一个 interface 接口 , 注解接口默认继承了

java.lang.annotation.Annotation 接口 ;
public interface Annotation extends java.lang.annotation.Annotation {
}





三、注解属性及类型


注解的本质是接口 , 接口中可以定义 常量 和 方法 ;


在注解中定义 接口方法 , 就是 注解的属性 ;


为注解添加属性 : 接口中的方法都是抽象方法 , 其中 public abstract 可以省略 ;


public @interface Annotation {
    public abstract String path();
}


注解属性使用格式 :


@注解名称(属性名称 = 属性值)


注解属性使用 : 在相关的代码上使用


 

@Annotation(path = "")
    Student(String name, int age){
    }






四、注解属性类型


注解属性 ( 接口方法 ) 返回值类型要求 :


① 基本数据类型 : byte , short , int , long , float , double , char , boolean ;


② 字符串类型 : String ;


③ 枚举类型 : enum ;


④ 注解类型 ;


⑤ 以上类型的数组形式 ;


注解属性返回值必须是以上的类型 , 不能设置其它类型返回值 , 否则会报错 ;



注解中定义了属性 , 在使用注解时 , 需要 给 注解属性 赋值 ;


定义 注解属性 时 , 可以 使用 default 关键字 指定属性默认值 , 下面代码中 , 制定 注解属性 intValue 值类型为 int 整型 , 默认值 88 ;


int intValue() default 88;


如果 注解属性 指定了默认值 , 在使用注解时 , 可以选择 不为该属性赋值 ( 此时使用默认属性值 ) , 也可以进行赋值 ( 指定一个新的属性值 ) ;


如果 注解属性 没有指定默认值 , 则使用 注解 时 , 必须为其指定一个默认值 , 否则编译时报错 ;



数组类型 的 注解属性 赋值 时 , 使用大括号进行赋值 , 大括号内是数组元素 , 如果只有一个属性 , 可以省略大括号 ,



注解 声明示例 :


public @interface Annotation {
    /**
     * 字符串类型
     * @return
     */
    String stringValue();
    /**
     * int 基本类型
     * @return
     */
    int intValue() default 88;
    /**
     * 枚举类型
     * @return
     */
    Number enumValue();
    /**
     * 注解类型
     * @return
     */
    Annotation2 annotationValue();
    /**
     * 字符串数组类型
     * @return
     */
    String[] stringArrayValue();
}



枚举类 :


public enum Number {
    ONE, TWO, THREE
}


Annotation2 注解类 :


public @interface Annotation2 {
}


注解使用示例 :


/**
 * 注解生成文档
 *
 * @author hsl
 * @version  0.1
 * @since 1.5
 */
public class Student {
    /**
     * 构造函数
     * @param name 参数一
     * @param age 参数二
     */
    @Annotation(
            stringValue = "tom",
            enumValue = Number.ONE,
            annotationValue = @Annotation2,
            stringArrayValue = {"tom", "jerry"})
    Student(String name, int age){
    }
    @SuppressWarnings("all")
    @Override
    public String toString() {
        return super.toString();
    }
}


代码分析 : 重点关注注解的使用 , 使用注解时 , 需要给 没有默认值 的 注解属性 赋值 , 格式为 注解属性名称 = 对应类型属性值 , 如果 注解属性 有默认值 , 则


@Annotation(stringValue = "tom", enumValue = Number.ONE, stringArrayValue = {"tom", "jerry"})






五、注解属性赋值简化操作


如果 注解属性 名称是 value , 并且 注解中只有 1 11 个属性 , 那么在使用 注解 为 注解属性 赋值时 , 可以省略注解名称 , 直接传入 注解属性值 ;


示例 : JDK 自带的 SuppressWarnings 注解 ,


@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}


注解使用 : 使用 SuppressWarnings 注解时 , 直接传入 “all” 参数 , 省略了注解属性名称 ;


 

@SuppressWarnings("all")
    @Override
    public String toString() {
        return super.toString();
    }



满足两个条件 , 才能使用上述简化方式 ;


目录
相关文章
|
3月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
143 4
|
5月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
6月前
|
XML 人工智能 Java
java通过自定义TraceId实现简单的链路追踪
本文介绍了如何在Spring Boot项目中通过SLF4J的MDC实现日志上下文traceId追踪。内容涵盖依赖配置、拦截器实现、网关与服务间调用的traceId传递、多线程环境下的上下文同步,以及logback日志格式配置。适用于小型微服务架构的链路追踪,便于排查复杂调用场景中的问题。
297 0
|
9月前
|
存储 Java 数据挖掘
Java 中数组的多种定义方式
本文深入解析了Java中数组的多种定义方式,涵盖基础的`new`关键字创建、直接初始化、动态初始化,到多维数组、`Arrays.fill()`方法以及集合类转换为数组等高级用法。通过理论与实践结合的方式,探讨了每种定义方法的适用场景、优缺点及其背后的原理,帮助开发者掌握高效、灵活的数组操作技巧,从而编写更优质的Java代码。
463 0
|
10月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
226 25
|
10月前
|
存储 监控 Java
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
229 23
|
10月前
|
Java 编译器 开发者
注解的艺术:Java编程的高级定制
注解是Java编程中的高级特性,通过内置注解、自定义注解及注解处理器,可以实现代码的高度定制和扩展。通过理解和掌握注解的使用方法,开发者可以提高代码的可读性、可维护性和开发效率。在实际应用中,注解广泛用于框架开发、代码生成和配置管理等方面,展示了其强大的功能和灵活性。
232 25
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
12065 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
417 34
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
245 7

热门文章

最新文章