模拟@Test的功能实现代码

1.1.1 需求:
定义一个类,在类中编写一些测试方法:测试方法的格式:public void xxx() 在测试方法上添加@MyTest 然后可以使这个类中添加了有@MyTest注解的方法执行.
1.1.2 分析:1.1.2.1 技术分析:
【注解的概述】


Ø 注解和注释区别:

* 注释:给程序员看的.

* 注解:给虚拟机看的.(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能.)

【JDK中提供的注解】

Ø @Override        :描述子类重写父类的方法:

* JDK1.5版本的时候 该注解只能应用在 类的继承上.

* JDK1.6版本的时候 该注解可以应用在 类的实现上.

Ø @SuppressWarnings        :压制警告.

Ø @Deprecated        :描述方法过时.

【自定义注解】

Ø 自定义注解:

* 定义类        :class

* 定义接口        :interface

* 定义枚举        :enum

* 定义注解        :@interface

Ø 代码实现:

/**

 * 定义一个注解:名称是Anno1

 */

@interface Anno1{

}

Ø 定义注解的属性:

 Invalid type Date for the annotation attribute Anno2.d; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof

* 注解的属性的类型:

    * 基本数据类型:

    * String类型:

    * Class类型:

  * 注解类型:

    * 枚举类型:

    * 以上类型的一维数组:
  • 代码实现:
/**

 * 定义一个带有属性的注解:Anno2

 */

@interface Anno2{

int a();

boolean b() default false;

String s();

// Date d();

Class c();

Anno1 anno1();

Color color();

String[] arrs();

}

***** 特殊的属性名称:value

 * 如果使用注解的时候,只出现了value属性,value属性可以省略的.

1.1.3 代码实现:

【步骤一】:自定义注解:MyTest

【步骤二】:定义核心运行类.

【步骤三】:在核心运行类中.

    * 获得测试类的Class

    * 获得Class中的所有方法.

    * 遍历得到每个方法.

    * 判断方法上有MyTest注解,就执行该方法.

         * 自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)

代码:

public class CoreRunner {

public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
/**

 * 获得测试类的Class.

 * 获得Class中的所有的方法.

 * 遍历每个方法,查看每个方法上是否有MyTest注解.

 * 有MyTest注解,这个方法就执行.

 */

// 1.获得测试类的Class:

Class clazz = AnnotationDemo1.class;

// 2.获得Class中的所有的方法: 规定了测试的方法必须是public.

Method[] methods = clazz.getMethods();

// 3.遍历每个方法:

for(Method method:methods){

boolean flag = method.isAnnotationPresent(MyTest.class);

// System.out.println(method.getName()+ "     " + flag);

if(flag){

// 说明方法上有MyTest注解:

method.invoke(clazz.newInstance(), null);

}

}

}

}

猜你喜欢

转载自blog.51cto.com/13587708/2135371