【Java 注解】自定义注解 ( 元注解 )(二)

简介: 【Java 注解】自定义注解 ( 元注解 )(二)

被 @Target(ElementType.TYPE) 元注解修饰的 Annotation 注解 , 只能在 类 上进行标注 ;


@Annotation(
        stringValue = "tom",
        enumValue = Number.ONE,
        annotationValue = @Annotation2,
        stringArrayValue = {"tom", "jerry"})
public class Student {
}



Target 注解中 , ElementType[] value() 注解属性的类型是数组类型 , 说明可以设置多个 注解 标注 位置 ;


如 : 使用如下


@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})


元注解修饰 Annotation 注解 , 则可以同时在 类 , 字段 和 方法上使用该 Annotation 注解 ;






四、@Retention 元注解


@Retention 注解用于说明该注解需要保留到什么阶段 ;


Java 代码的三个阶段分别是 : 源代码阶段 , 类对象阶段 , 运行时阶段 ;


查看 Retention 源码 ,


@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}


Retention 注解的 注解属性 RetentionPolicy value() , 其类型是 RetentionPolicy 枚举类型 , 三个枚举值 , 分别对应 Java 代码三大阶段 源代码阶段 , 类对象阶段 , 运行时阶段 ;


public enum RetentionPolicy {
    /** 
     * 源代码阶段
     * 编译器丢弃该注解.
     */
    SOURCE,
    /** 
     * 类对象阶段
     * 注解会被保存到字节码文件中, 不会被 JVM 读取到.
     */
    CLASS,
    /** 
     * 运行时阶段
     * 注解会被保存到字节码文件中, 并会被 JVM 读取到.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}


一般情况下 , 开发则自定义注解 , 都是在运行时进行一些代码分析 , 设置 RetentionPolicy.RUNTIME 注解属性 ;


@Retention(RetentionPolicy.RUNTIME)






五、@Documented 元注解


如果添加了该注解 , 表示当前注解会被抽取到 Java API 文档中 ;


@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}



使用 javadoc Student.java 命令 , 生成 Java 文档 ; 如果使用 @Documented 注解修饰 Annotation 注解 , 则导出的文档如下 , 在类和方法的上面会显示相应注解 ;


image.png


如果不使用 @Documented 注解 , 则生成的文档中没有 Annotation 注解 ;






六、@Documented 元注解


@Inherited : 描述 注解 是否被子类继承 , 如果添加了该注解 , 则子类会自动继承父类的注解 ;


使用 @Inherited 元注解 标注 Annotation 注解 ;


使用 Annotation 注解 标注父类 Person ;


子类 Student 继承 Person 类 , 子类中不添加注解 , 那么父类 Person 中的注解自动添加给子类 Student ;


目录
相关文章
|
3月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
108 1
|
2月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
83 7
|
3月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
63 1
|
2月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
117 34
|
2月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
136 5
|
3月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
108 14
|
3月前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
55 0
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
6天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。

热门文章

最新文章