• Java面试题-Java核心基础-第十一天(注解)


    目录

    一、注解是什么?

    二、注解的作用?

    三、Java中的内置注解有哪些?

    四、如何自定义一个注解?

    五、JDK8中的新特性


    一、注解是什么?

    注解就是一种可以标注在类、属性、方法、方法参数等结构上面的一种特殊“注释”,其实就可以看作是一种注释,这些注释信息可以生成文档、可以进行编译检查、可以在运行时获取到注释信息

    二、注解的作用?

    1. 生成文档 类上面的作者、时间、简要信息等信息  方法上面的对方法进行上面  对方法参数、返回值进行说明

    2. 编译检查,例如@Overide  可以检查方法是否是重写的方法 

    @Deprecated是标识方法已过时  @SuppressWarnings标明要忽略的警告 在编译是能够进行检查

    3. 编译时动态处理:可以在编译时对代码的元数据信息进行动态处理,比如动态生成代码

    4. 运行时动态处理:可以在运行时对代码的元数据信息进行动态处理,比如利用反射创建实例

    一般需要结合反射使用才能发挥作用

    三、Java中的内置注解有哪些?

    1. Java自带的标准注解:

    @Overide、@Deprecated是标识方法已过时、@SuppressWarnings标明要忽略的警告 编译的时候会对其进行检查

    2. 元注解

    @Target:标明注解能放置到那些位置上

    @Target({ElementType.TYPE,ElementType.FIELD}) 可以声明的类型:

    TYPE(类型,指的是类、接口、枚举)、FIELD(属性)、METHOD(方法)、PAR AMETER(参数)、CONSTRUCTOR(构造器)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE(注解类型)、PACKAGE(包)、TYPE_PARAMETER(类型 参数)、TYPE_USE(类型参数,更加广泛)

    @Retention:标明注解的生命域 

    属性值是RententionPolicy类型的枚举值:SOURCE(表示只存在于源文件中,编译后的字节码中不存 在,并且不能通过反射获取到)、CLASS(表示在字节码中也存在了,但还是不能通过反射获取到),RUNTIME(表示可以通过反射获取到)

    @Retention(RetentionPolicy.RUNTIME)

    @Inherited元注解:加上其注解,表示其被修饰的注解可以被子类所继承

    @Document元注解:表示在生成的文档中,能包含注解信息

    四、如何自定义一个注解?

    1. 使用@Interface创建注解

    2. 写好注解的元注解

    3. 写好注解里面的属性:

    注意如果只是一个value可以忽略,如果有多个参数的情况下,只有其他参数都有默认值的情况下,value才能进行忽略

    类型也不是任意的类型都行的,类型只能时  八种基本数据类型及其对应的包装类型、String、Class、Enum 、注解类型及这些类型对应的数组类型

    五、JDK8中的新特性

    1. 可重复注解

    就是可以在结构上面重复的写一个相同的注解,在jdk8之前需要使用注解数组的方式

    1. 定义你要重复的那个注解:

    1. @Target({ElementType.TYPE,ElementType.FIELD})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. public @interface MyAnnotation {
    4. String value();
    5. Status status() default Status.OK;
    6. }

    2. 构造一个注解表明你要重复  属性类型就是注解数组

    1. @Target({ElementType.TYPE,ElementType.FIELD})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. //因需要重复的注解而构造的s注解属性值必须是value
    4. public @interface MyAnnotations {
    5. MyAnnotation [] value();
    6. }

     3. 在之前你要重复的那个注解上面加上@Repeatable(value = MyAnnotations.class)元注解

    1. @Target({ElementType.TYPE,ElementType.FIELD})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Repeatable(value = MyAnnotations.class)
    4. public @interface MyAnnotation {
    5. String value();
    6. Status status() default Status.OK;
    7. }

    使用:

    1. @MyAnnotation("abc")
    2. @MyAnnotation("def")
    3. public class MidStudent extends Student{
    4. }

    2. 类型注解

    顾名思义就是在类型前面加上注解,用来 解释 类型

    像这样:

    1. public class School <@MyAnnotation1(value = "fa") T >{
    2. public void dosome(T t){
    3. //这种类型注解如果能使用,得在注解的Target元注解加上ElementType.TYPE_USE
    4. @MyAnnotation1("da") String name = "";
    5. }
    6. }

    使用的条件是在@Target注解中写好ElementType.TYPE_USE类型

    1. @Retention(RetentionPolicy.RUNTIME)
    2. @Target({ElementType.TYPE_USE})
    3. @Inherited
    4. @Documented
    5. public @interface MyAnnotation1 {
    6. String value();
    7. }

  • 相关阅读:
    基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理
    Gitter+Sidecar制作聊天室
    Thoughtworks 全球CTO:按需求构建架构,过度工程只会“劳民伤财”
    nginx学习笔记
    文心一言 VS 讯飞星火 VS chatgpt (232)-- 算法导论17.1 3题
    谷歌浏览器安装vue调试工具vue-devtools最全
    STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写
    新库上线 | CnOpenData国际货运代理信息数据
    apex应用程序创建和对比
    Apache Doris (五十四): Doris Join类型 - Bucket Shuffle Join
  • 原文地址:https://blog.csdn.net/m0_63445035/article/details/134002394