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

【Java基础面试题046】Java中的注解原理是什么?

注解其实就是一个标记,是一种提供元数据的机制,用于给代码添加说明信息。可以标记在类上、方法上、属性上等,标记自身也可以设置一些值。

注解本身不影响程序的逻辑执行,但可以通过工具或框架来利用这些信息进行特定的处理,如代码生成、编译时检查、运行时处理等。

扩展知识

自定义注解

注解的定义使用@interface关键字。

  • @interface用来声明一个注解。
  • value是注解的一个成员变量,default关键字可以为成员变量设置默认值。
  • age也是一个成员变量,但没有默认值,所以在使用时必须提供这个值。

处理注解

  • 编译时处理:使用javax.annotation.processing 包进行注解处理器的开发
  • 运行时处理:使用反射机制访问注解,通过Class.getAnnotation()或Field.getAnnotation()等方法获取注解信息

元注解

Java提供了四种元注解来帮助定义其他注解:

  • @Retention: 定义注解的生命周期(SOURCE, CLASS, RUNTIME)。
  • @Target: 定义注解可以应用的目标(类、方法、字段等)。
  • @Documented: 标记注解是否应被包含在JavaDoc中。
  • @Inherited: 允许子类继承父类中的注解。

注解的三大保留策略

SOURCE:注解只存在于源码中,在编译时被丢弃

CLASS:注解只存在编译期,也就是编译后的.class文件中,但运行时不会被JVM加载

RUNTIME:注解在整个生命周期内都保留,运行时可以通过反射获取

例如这个注解,就是专门给编译器用的,class文件是不会有这个注解的

再比如Spring的Autowired,是RUNTIME的,在运行时可以通过反射获取注解的信息

Target

  • TYPE:类、接口、注解或枚举
  • FIELD:字段(包括枚举常量)
  • METHOD:方法
  • PARAMETER:方法参数
  • CONSTRUCTOR:构造方法
  • LOCAL_VARIABLE:局部变量
  • ANNOTATION_TYPE:注解类型
  • PACKAGE:包

运行时可以用反射获取注解的成员信息

public class AnnotationTest {
    public static void main(String[] args) {
        new AnnotationTest().introduce();
    }
    @MyAnnotation(age = 20)
    public void introduce(){
        Method introduce = null;
        try {
            introduce = AnnotationTest.class.getDeclaredMethod("introduce");
        }catch (NoSuchMethodException e){
            e.printStackTrace();
        }
        if (introduce.isAnnotationPresent(MyAnnotation.class)){
            MyAnnotation annotation = introduce.getAnnotation(MyAnnotation.class);
            System.out.println(annotation.value() + "第一次遇见他,是" + annotation.age() + "岁");
        }
    }
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    // 定义注解的成员变量
    String value() default "王心妍";
    int age();
}


http://www.kler.cn/a/452425.html

相关文章:

  • Python双指针
  • 微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果
  • flink sink doris
  • 外包干了两年,技术退步明显...
  • LeetCode每日三題(三
  • shell学习简介(一)
  • 【三维重建】去除瞬态物体Distractor汇总
  • 【行空板K10】评测资料准备
  • 华为OD机试 密码截获(C/JAVA)
  • NNDL 作业11 LSTM
  • FFmpeg在python里推流被处理过的视频流
  • MyBatis如何处理延迟加载?
  • 三维扫描在汽车/航空行业应用
  • Java web的发展历史
  • C#中的委托机制:深入理解与应用
  • 基于earthSDK三维地图组件开发
  • vue.js 指令的修饰符
  • 16.2、网络安全风险评估技术与攻击
  • 解决Gradle下载很慢,运行及打包很慢
  • 在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题
  • 【ELK】ES单节点升级为集群并开启https【亲测可用】
  • 探索 Samba 服务器:搭建跨平台文件共享的桥梁