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反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...
Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...
首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不直接影响代码的执行。Java提供了内置的注解,如`@Override`、`@Deprecated`等,但自定义注解允许我们...
总的来说,Spring的IOC结合Java反射和自定义注解,构建了一种灵活且强大的组件管理和依赖注入机制。通过深入理解这些概念,开发者可以更好地利用Spring框架,实现松耦合、高内聚的软件设计。在实际项目中,可以使用`...
Java反射和注解是Java开发中的重要特性,它们在现代Java EE框架中起着至关重要的作用。本文将深入探讨这两个概念及其在实际开发中的应用。 首先,Java反射机制允许程序在运行时动态地获取类的信息并操作类的对象。...
这些Demo旨在帮助学习者深入理解Java注解和反射的原理与应用,通过实际操作加深对这两个概念的认识,提高开发能力。在学习过程中,结合B站狂神的讲解,能够更有效地掌握这些高级特性,为日后的项目开发打下坚实的...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...
在Java编程语言中,反射和注解是两个非常重要的特性,它们极大地增强了代码的灵活性和元数据的使用。本文将深入探讨这两个概念的原理及应用方法。 反射(Reflection)是Java提供的一种强大的机制,允许程序在运行时...
通过阅读《Java通用注解和API规范.pdf》这份文档,你可以更深入地理解Java注解的原理、使用方法以及最佳实践,从而在实际开发中更好地利用这一强大的工具。这份文档涵盖了从基础概念到高级特性的全面内容,对于Java...
然后,通过Java反射API,可以获取到这些注解信息,进行相应的处理。 例如,`@Override`注解告诉编译器,被注解的方法应该重写其父类的方法。如果找不到匹配的父类方法,编译器将报错。而`@Deprecated`注解则会在...
通过学习这些例子,你可以深入理解Java注解的工作原理,如何创建和使用自定义注解,以及它们在实际项目中的应用。同时,你还可以了解注解与其他Java特性的交互,如反射和注解处理器,这将有助于提升你的Java编程技能...
### Java反射机制详解 #### 一、概述 Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年...
### Java基础-注解和反射 #### 注解(Annotation) 从JDK5开始,Java引入了一个重要的特性——元数据支持,即注解。这是一项强大的功能,它允许开发者在不改变原有代码逻辑的情况下向源代码中添加额外的信息。注解在...
无论是使用预定义的注解还是自定义注解,都需要理解其工作原理和使用方式,以便更好地利用这一强大的工具。通过学习和实践,开发者能够更有效地实现各种功能,如依赖注入、代码生成和编译时检查。
本文将深入探讨Java注解的工作原理及其应用。 1. **注解定义** - 注解以`@`符号开头,后跟注解类型的名称。例如,`@Override`用于表明方法覆盖了超类的方法。 - 注解可以带有参数,参数值用括号包围,如`@...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Spring框架中,反射扮演着核心角色,特别是在依赖注入(DI)和面向切面编程(AOP)中。下面我们...
注解的原理在于,当Java源码被编译时,编译器会处理注解并将它们包含在生成的字节码(`.class`文件)中。根据Java虚拟机(JVM)规范,注解信息存储在类、字段或方法的属性中。例如,当一个注解应用在类上时,编译器...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制的核心在于`java.lang.reflect`包中的类和接口,如Class、Constructor、Method和Field。通过反射,...