零基础java自学流程-Java语言进阶180

本文深入探讨Java注解的工作原理及其与反射的关系。通过自定义注解和虚拟机规范的角度,详细解释了注解如何在字节码级别存储及通过Class类进行反射操作的方法。

4、注解与反射

通过前文可知,注解本质上时继承了Annotation接口的接口。另外,我们可以从虚拟机的层面来分析注解的本质。

首先自定义一个注解类型:

@Target(value = {ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Hello {
    String value();
}

上述定义指明这个注解只能修饰字段和方法,并且该注解永久存活,以便我们反射获取。

虚拟机规范定义了一系列和注解相关的属性表。无论是字段、方法或是类本身,如果被注解修饰了,就可以被写进字节码文件。属性表有以下几种:

  • RuntimeVisibleAnnotations:运行时可见的注解
  • RuntimeInVisibleAnnotations:运行时不可见的注解
  • RuntimeVisibleParameterAnnotations:运行时可见的方法参数注解
  • RuntimeInVisibleParameterAnnotations:运行时不可见的方法参数注解
  • AnnotationDefault:注解类元素的默认值

上述属性表显示了注解在字节码文件中存储方式。因此对于一个类或接口,Class类中提供了下列方式用于反射:

  • getAnnotation:返回指定的注解
  • isAnnotationPresent:判定当前元素是否被指定注解修饰
  • getAnnotations:返回所有的注解
  • getDeclaredAnnotation:返回本元素的指定注解
  • getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的

用例:

首先设置一个虚拟器启动参数,用于捕获JDK动态代理类。

-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true


尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili尚学堂给同学们带来全新的Java300集课程啦本课程为Java300集2022版第一季,配合最新版的Java课程,所有视频重新录制,课件所有图形做了重新绘制和配色,图解学习Java,让学习成为一种享受本套教程专门为零基础学员而制,适合准备入行Java开发的零基础学员,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。后续课https://www.bilibili.com/video/BV1qL411u7eE?from=search&seid=2322669758623357936&spm_id_from=333.337.0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值