通过JUnit理解反射与注解的使用方式与场景

通过JUnit深入理解反射与注 解的使用方式与场景

[quote]JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。[/quote]

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是常被并提的两个术语。

[b]一、为什么Junit4.0中,某个单元测试类的测试方法标注了@Test注解之后,就会获得执行: [/b]
1、类定义好了,Class对象就可以获得
2、Class对象获得之后,类里面所有方法所对应的Method对象构成的数组也可以获得。
3、循环遍历Method数组,取出每一个Method对象,然后拿这个Method对象调用一下isAnnotationPresent(测试类注解名Test),判断这个方法上面是否存在@Test这样一个注解,如果有这个注解的话,method.invoke()这个方法。这个方法就获得执行。

[b]二、名言:没有反射,很多框架就不存在了。(No Reflection,No most frameworks) [/b]

[b]三、Junit4的执行的一般流程:[/b]
1、首先获得待测试类所对应的Class对象。
2、然后通过该Class类对象获得当前类中所有的public方法所对应的method数组。
3、遍历该Method数组,取得每一个Method对象
4、调用每个Method对象的isAnnotationPresent(Test.class)方法,判断该方法是否被@Test注解所修饰。
5、如果该方法返回true,那么调用method.invoke()方法执行该方法,否则不执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Junit 是一个流行的 Java 单元测试框架,它使用注解反射实现测试的自动化。在 Junit 中,可以使用注解来标记测试方法,并使用反射来执行这些方法。 要给注解中的 int 值排序,可以使用反射来获取注解的值并进行排序。下面是一个简单的示例: ```java import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface SortValue { int value(); } public class TestClass { @SortValue(3) public void method1() { System.out.println("Method 1"); } @SortValue(1) public void method2() { System.out.println("Method 2"); } @SortValue(2) public void method3() { System.out.println("Method 3"); } public static void main(String[] args) { Class<?> clazz = TestClass.class; Method[] methods = clazz.getDeclaredMethods(); // 使用 TreeMap 来按照注解的值进行排序 TreeMap<Integer, Method> sortedMethods = new TreeMap<>(); for (Method method : methods) { SortValue annotation = method.getAnnotation(SortValue.class); if (annotation != null) { sortedMethods.put(annotation.value(), method); } } for (Method method : sortedMethods.values()) { try { method.invoke(clazz.newInstance()); } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { e.printStackTrace(); } } } } ``` 在上面的示例中,我们定义了一个 `SortValue` 注解,用于给测试方法指定排序值。然后在 `TestClass` 中,我们使用了这个注解来标记几个测试方法。 在 `main` 方法中,通过反射获取到了 `TestClass` 的所有方法,并将带有 `SortValue` 注解的方法按照注解的值使用 `TreeMap` 进行排序。最后,按照排序后的顺序依次调用这些方法。 这样,就能够按照注解中的 int 值进行排序并执行相应的测试方法了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值