`
uule
  • 浏览: 6297586 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

java反射原理, 注解原理

阅读更多

注解机制及原理

JAVA注解原理详解

深入理解注解实现原理

 

 

java.lang.annotation提供了四种元注解,专门注解其他的注解:

@Documented

@Retention

@Target

 

@Inherited 

 

@Documented –注解是否将包含在JavaDoc中

@Retention –什么时候使用该注解

RetentionPolicy.SOURCE

        – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。

@Override, @SuppressWarnings都属于这类注解。

@Override告诉编译器这个方法是一个重写方法(描述方法的元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。如果我不小心拼写错误,例如将toString()写成了toStrring(){double r},而且我也没有使用@Override注解,那程序依然能编译运行。但运行结果会和我期望的大不相同。

 

RetentionPolicy.CLASS

       – 在类加载的时候丢弃。在字节码文件的处理中有用。【注解默认使用这种方式。】

RetentionPolicy.RUNTIME

       – 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

 

@Target –注解用于什么地方

ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息

 

@Inherited – 是否允许子类继承该注解

这4个元注解都是在jdk的java.lang.annotation包下面

 

 

Test t = AnnotationTest.class.getAnnotation(Test.class);
tm = AnnotationTest.class.getDeclaredMethod("test",null).getAnnotation(TestMethod.class);
AnnotationTest.class.getDeclaredField("field").getAnnotation(MyAnTargetField.class);

 

从上面的句子就可以看出,它是【从class结构中获取出Test注解的】,所以肯定是在某个时候注解被加入到class结构中去了。

从java源码到class字节码是由编译器完成的,而注解也是在编译时由编译器进行处理,【编译器会对注解符号处理并附加到class结构中】,根据jvm规范,class文件结构是严格有序的格式,唯一可以附加信息到class结构中的方式就是【保存到class结构的attributes属性中】。我们知道对于类、字段、方法,在class结构中都有自己特定的表结构,而且各自都有自己的属性,而对于注解,作用的范围也可以不同,可以作用在类上,也可以作用在字段或方法上,这时编译器会对应将注解信息存放到类、字段、方法自己的属性上。

 

在我们的AnnotationTest类被编译后,在对应的AnnotationTest.class文件中会包含一个RuntimeVisibleAnnotations属性,由于这个注解是作用在类上,所以此属性被添加到类的属性集上。即Test注解的键值对value=test会被记录起来。而当JVM加载AnnotationTest.class文件字节码时,就会将RuntimeVisibleAnnotations属性值保存到AnnotationTest的Class对象中,于是就可以通过AnnotationTest.class.getAnnotation(Test.class)获取到Test注解对象,进而再通过Test注解对象获取到Test里面的属性值。

 

其实注解被编译后的本质就是一个继承Annotation接口的接口,所以@Test其实就是

 

public interface Test extends Annotation

 

当我们通过AnnotationTest.class.getAnnotation(Test.class)调用时,JDK会通过动态代理生成一个实现了Test接口的对象,并将RuntimeVisibleAnnotations属性值设置进此对象中,此对象即为Test注解对象,通过它的value()方法就可以获取到注解值。

 

 

分享到:
评论

相关推荐

    Java注解与反射原理说明

    今天小编就为大家分享一篇关于Java注解与反射原理说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Spring IOC 原理 ,Java 反射实例,自定义注解

    NULL 博文链接:https://zyqwst.iteye.com/blog/2255560

    反射,注解原理和使用的方法

    反射,注解原理和使用的方法

    java反射和注解开发(备java基础,javaee框架原理)

    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。

    Java反射机制与框架原理

    这是『Java学习指南系列』的第18篇教程 ,是Java开发的高级课程,介绍反射机制、注解和框架设计的一般性原理。 二、主要内容  本篇包含以下内容: * 使用反射机制,读取Class中的字段信息 * 使用反射机制,对...

    Java反射机制项目实践源码

    Java反射机制,原理实现,涵盖大部分函数,并有大量注解,方便理解

    JAVA核心知识点整理.zip

    java核心知识点整理,面试很有用 Java核心知识点2.JVM ...5.2JAVA 反射 5.3JAVA 注解 5.4JAVA 内部类 5.5JAVA 泛型 5.6JAVA 序列化(创建可复用的 Java 对象) 5.7JAVA 复制 6. Spring 原理

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 继承、封装、多态的实现原理 容器 Java集合类总结 Java集合详解1:一文读懂ArrayList,Vector与Stack使用...

    Java工程师面试复习指南

    Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 继承封装多态的实现原理 集合类 Java集合类总结 Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和...

    JAVA+android学习思维导图.7z

    2、Java中的注解.mmap 3、Java网络编程.mmap 4、Java中的反射.mmap 5、Java中级总结.mmap 6、Swing和事件处理.mmap 7、多线程.mmap 8、IO.mmap 9、Collection.mmap 10、搜索引擎的使用方法.mmap 11、NDK初步.mmap 二...

    java最新面试题50道精讲

    7 、解释一下Java中的反射机制是什么,以及如何使用反射? 8 、解释一下Java中的注解是什么,以及如何使用注解? 9 、解释一下Java中的基本数据类型和引用数据类型的区别是什么? 10、解释一下Java中的垃圾回收机制...

    想自己写框架?不了解Java注解(Annotation)机制可不行,来跟我一起通过源码深入Java注解机制

    无论是在JDK还是框架中,注解都是很重要的一部分,我们使用过很多注解,但是你有真正去了解过他的实现原理么?你有去自己写过注解么? 一、相关 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及...

    JAVA高并发高性能高可用高扩展架构视频教程

    企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老...

    CS 自学指南(Java编程语言、数据库、数据结构与算法、计算机组成原理、操作系统、计算机网络、英语、简历、面试).zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java基础笔记(包括底层原理)

    Java基础笔记(包括底层原理),持续更新中,如提前下载可私信我后续的更新免费提供。 本笔记7w+字非常具体 以更新完的笔记目录如下: 第一章(基础) 第二章常用类 第三章集合框架 第四章文件和io 第五章多线程和...

    java基础案例与开发详解案例源码全

    15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...

    Java面试题.docx

    16、说说你对Java反射的理解 17、说说你对Java注解的理解 18、Java中String的了解 19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? 21-40题 21、List,Set,Map的区别 26...

    java必了解的六大问题

    *第三阶段:java API:输入输出,多线程,网络编程,反射注解等,java的精华部分; *第四阶段:数据库SQL基础,包括增删改查操作以及多表查询; *第五阶段:JDBC编程:包括JDBC原理,JDBC连接库,JDBC API,...

    狂神说上课笔记未删减 Java基础到技术升级

    14、JavaSE:注解和反射 15、MySQL和JDBC 16、前端:Html5 17、前端:CSS3 18、前端:JavaScript、jQuery 19、JavaWeb 20、MyBatis 21、Spring 22、SpringMVC 23、大前端串讲 24、Vue精讲 25、...

    Java学习笔记

    概念和原理方面:线程、类库API(文档)、泛型、枚举、注解、反射、网络等 JAVA中最大的特点是面向对象,面向对象的概念最早出现在70年代,由Smaltalk(IBM)提出来的。 JAVA语言跨平台执行,它必须先编译后解释执行,...

Global site tag (gtag.js) - Google Analytics