A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-7-4 17:27 编辑

【郑州校区】模拟@Test的功能实现代码

1.1.1 需求:
定义一个类,在类中编写一些测试方法:测试方法的格式:public void xxx() 在测试方法上添加@MyTest 然后可以使这个类中添加了有@MyTest注解的方法执行.
1.1.2 分析:1.1.2.1 技术分析:
【注解的概述】
[AppleScript] 纯文本查看 复制代码
Ø 注解和注释区别:

* 注释:给程序员看的.

* 注解:给虚拟机看的.(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能.)
【JDK中提供的注解】
[AppleScript] 纯文本查看 复制代码
Ø @Override        :描述子类重写父类的方法:

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

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

Ø @SuppressWarnings        :压制警告.

Ø @Deprecated        :描述方法过时.
【自定义注解】
[AppleScript] 纯文本查看 复制代码
Ø 自定义注解:

* 定义类        :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类型:

  * 注解类型:

    * 枚举类型:

    * 以上类型的一维数组:
* 代码实现:
[AppleScript] 纯文本查看 复制代码
/**

 * 定义一个带有属性的注解: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 代码实现:
[AppleScript] 纯文本查看 复制代码
【步骤一】:自定义注解: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);

}

}

}

}
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马