通过JUnit深入理解反射与注 解的使用方式与场景
引用
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。
一、为什么Junit4.0中,某个单元测试类的测试方法标注了@Test注解之后,就会获得执行:
1、类定义好了,Class对象就可以获得
2、Class对象获得之后,类里面所有方法所对应的Method对象构成的数组也可以获得。
3、循环遍历Method数组,取出每一个Method对象,然后拿这个Method对象调用一下isAnnotationPresent(测试类注解名Test),判断这个方法上面是否存在@Test这样一个注解,如果有这个注解的话,method.invoke()这个方法。这个方法就获得执行。
二、名言:没有反射,很多框架就不存在了。(No Reflection,No most frameworks)
三、Junit4的执行的一般流程:
1、首先获得待测试类所对应的Class对象。
2、然后通过该Class类对象获得当前类中所有的public方法所对应的method数组。
3、遍历该Method数组,取得每一个Method对象
4、调用每个Method对象的isAnnotationPresent(Test.class)方法,判断该方法是否被@Test注解所修饰。
5、如果该方法返回true,那么调用method.invoke()方法执行该方法,否则不执行。
分享到:
相关推荐
通过学习这些例子,你可以深入理解Java注解的工作原理,如何创建和使用自定义注解,以及它们在实际项目中的应用。同时,你还可以了解注解与其他Java特性的交互,如反射和注解处理器,这将有助于提升你的Java编程技能...
此外,反射还常用于插件系统、ORM框架(如Hibernate)、测试工具(如JUnit)等场景。 注解和反射相结合,可以实现更灵活和强大的功能。例如,我们可以使用注解来标记某些类或方法,然后通过反射在运行时查找这些...
- **反射与注解**:通过反射API,可以在运行时检查类、接口、方法或字段是否包含特定的注解,以及获取注解的值。 4. **框架中的注解应用** - **Spring框架**:Spring的注解如@Service、@Controller、@Repository...
JUnit框架提供了灵活的方式来实现这一点,如通过公共方法暴露状态数据或使用反射。 - **模拟与存根**:在某些情况下,直接测试依赖于外部系统的代码可能会比较复杂。这时可以通过模拟(Mock)或存根(Stub)技术来...
例如,EJB 3.0使用注解来声明实体bean和接口,而JUnit 4允许通过注解直接定义测试方法,无需XML配置。随着Java平台的发展,注解的使用场景持续扩大,包括Spring框架中的@Component、@Service、@Repository等,以及...
- **运行时处理**:在运行时通过反射API访问注解信息,例如`Class.getAnnotations()`。 4. **元注解**:元注解是用于注解其他注解的注解,如`@Retention`、`@Target`、`@Documented`和`@Inherited`: - `@...
本篇文章将深入探讨注解的定义、种类、使用方式以及其在实际开发中的应用。 注解的定义: 注解是一种声明式的编程元素,可以被编译器或JVM读取,用于提供有关程序元素(如类、方法、变量等)的额外信息。它以`@`...
使用@Test注解标记,JUnit会自动检测并运行这些方法。 3. **断言(Assertions)**:JUnit提供了一系列的断言方法,如assertEquals()、assertTrue()、assertFalse()等,用于检查预期结果是否与实际结果相符。 4. **...
通过阅读源码,我们可以了解到如何编写测试框架的基本结构,以及如何使用Java反射和注解来驱动测试执行。 在实际开发中,工具的集成也是关键。许多IDE(如Eclipse和IntelliJ IDEA)都内置了对JUnit的支持,可以方便...
注解可以通过反射来读取,以便在运行时检查或处理。 反射是Java提供的一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法。通过反射,我们可以获取Class对象,这代表了运行时的类信息。比如,我们...
通过阅读《黑马程序员---注解归纳》这篇博客,你将能够深入理解注解的工作原理,学习如何利用注解提升代码质量,并掌握在不同场景下使用注解的最佳实践。同时,配合提供的`annotation.txt`文件,你可能能获取到更多...
然后,通过Java反射API,可以获取到这些注解信息,进行相应的处理。 例如,`@Override`注解告诉编译器,被注解的方法应该重写其父类的方法。如果找不到匹配的父类方法,编译器将报错。而`@Deprecated`注解则会在...
处理注解的方式有两种:编译时处理(通过注解处理器,实现`javax.annotation.processing.Processor`接口)和运行时处理(通过反射API访问注解信息)。 5. **元注解**: 元注解是应用在其他注解上的注解,它们提供...
通过上述内容,你应该对Java的注解有了基本的理解,它极大地提高了代码的可读性和维护性,简化了各种框架的配置,并为构建更复杂的工具和系统提供了可能。在实际编程中,熟练掌握注解的使用将有助于提升开发效率和...
这里使用了`@Retention(RetentionPolicy.RUNTIME)`来指定注解的保留策略,意味着这个注解不仅在编译时有效,还会在运行时保留,这样我们就可以在运行时通过反射API来访问这些注解信息。 实验中创建了一个`Person`类...
1. 获取Class对象:反射的入口是获取Class对象,可以通过以下三种方式: - 使用Class.forName()方法,传入类的全名(包括包名)。 - 调用任何对象的getClass()方法。 - 直接使用类的.class属性,如String.class。...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。...通过阅读和理解这个程序,你可以更好地掌握Java反射的实战应用。
反射还可以用来检查类、方法、字段上的注解,通过`getAnnotations()`和`isAnnotationPresent(Class<? extends Annotation> annotationClass)`等方法获取注解信息。 9. **动态代理**: Java的`java.lang.reflect....
6. **示例应用** - 反射在许多实际场景中有广泛的应用,如Spring框架中的依赖注入,Hibernate等ORM框架中的对象关系映射,以及单元测试工具如JUnit的注解驱动测试等。 通过学习和理解Java反射,开发者可以编写出...