java反射原理, 注解原理

栏目: Java · 发布时间: 6年前

阅读更多

注解机制及原理

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 –注解用于什么地方

@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()方法就可以获取到注解值。

分享到:

Nginx负载均衡+Keepalived高可用

评论


以上所述就是小编给大家介绍的《java反射原理, 注解原理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人月神话(40周年中文纪念版)

人月神话(40周年中文纪念版)

(美) 布鲁克斯(Brooks, F. P.) 著 / UML China翻译组,汪颖 译 / 清华大学出版社 / 2015-4-1 / 68.00元

在软件领域,很少能有像《人月神话》一样具有深远影响力和畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。本书内容来自Brooks博士在IBM公司SYSTEM/360家族和OS/360中的项目管理经验,该项目堪称软件开发项目管理的典范。该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄、中、韩等多种文字,全球......一起来看看 《人月神话(40周年中文纪念版)》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具