模拟@Test的功能实现
注解和注释区别
* 注释:给程序员看的.
* 注解:给虚拟机看的.(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能.)
JDK中提供的注解
@Override :描述子类重写父类的方法:
* JDK1.5版本的时候 该注解只能应用在 类的继承上.
* JDK1.6版本的时候 该注解可以应用在 类的实现上.
@SuppressWarnings :压制警告.
@Deprecated :描述方法过时.
自定义注解
* 定义类 :class
* 定义接口 :interface
* 定义枚举 :enum
* 定义注解 :@interface
定义注解的属性:
注解的属性的类型:
* 基本数据类型
* String类型
* Class类型
* 注解类型
* 枚举类型
* 以上类型的一维数组
package com.boomoom.a_annotation.demo2; /**
* 自定义注解
* @author admin
*
*/
@Anno1
@Anno2(a=1,s="abc",c=AnnotationDemo1.class,anno1=@Anno1,color=Color.RED,arrs={"aa","bb"})
@Anno3("abc")
public class AnnotationDemo1 { }
/**
* 定义一个注解:名称是Anno1
*/
@interface Anno1{ } /**
* 定义一个带有属性的注解:Anno2
*/
@interface Anno2{
int a();
boolean b() default false;
String s();
// Date d();
Class c();
Anno1 anno1();
Color color();
String[] arrs();
} enum Color{
RED,BLUE,BLACK,YELLOW;
} @interface Anno3{
String value();
int a() default 1;
}
代码实现
特殊的属性名称:value
* 如果使用注解的时候,只出现了value属性,value属性可以省略的.
代码实现
1、自定义注解:MyTest
2、定义核心运行类.
3、在核心运行类中.
3.1、获得测试类的Class
3.2、获得Class中的所有方法.
3.3、遍历得到每个方法.
3.4、判断方法上有MyTest注解,就执行该方法.
3.5、自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)
package com.boomoom.a_annotation.demo3; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; /**
* 自定义注解
* @author admin
*
*/
// 自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)
// 自定义注解的存在时间有源码、编译和运行阶段,指定为运行阶段,才能在运行时有自定义注解存在
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyTest { }
MyTest
package com.boomoom.a_annotation.demo3;
public class AnnotationDemo1 {
@MyTest
public void demo1(){
System.out.println("demo1执行了...");
}
@MyTest
public void demo2(){
System.out.println("demo2执行了...");
}
public void demo3(){
System.out.println("demo3执行了...");
}
}
AnnotationDemo1
package com.boomoom.a_annotation.demo3; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* 核心运行类:
* @author admin
*
*/
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);
}
}
}
}
CoreRunner
模拟@Test的功能实现的更多相关文章
- Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。
package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...
- ListView模拟微信好友功能
ListView模拟微信好友功能 效果图: 分析: 1.创建listView 2.创建数据 3.创建适配器 将数据放到呈现数据的容器里面. 将这个容器(带数据)连接适配器. 其实是直接在我们自己写的a ...
- 编写函数模拟strcpy()函数功能
strcpy(字符数组1,字符串2) strcpy( )用于将字符串2复制到字符数组1中 /* strcpy(字符数组1,字符串2) strcpy( )用于将字符串2复制到字符数组1中 模拟strcp ...
- TCP模拟QQ聊天功能
需求: 模拟qq聊天功能:实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示. 提示: 客户端 1) ...
- 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能
2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main( ...
- js模拟实现继承功能
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 在VFP6中模拟CursorAdapter的功能
这个是我在2002年做的一个VFP程序中实现的方法, 现在看来功能和VFP8,9中的CursorAdapter非常相似, 因为属性设置有许多相同的地方,我甚至怀疑CA就是就是在这样的基础上再包装出来的 ...
- 模拟storage copy 功能失败的记录
试验设想: 机器1: alter database begin backup 然后,在oracle仍然活动的状态下,将$ORACLE_BASE目录全部压缩拷贝到机器2 机器2: startup:失败 ...
- PyQt4 模拟记事本基本功能(保存,打开文件)
完成功能: 1. 默认[保存]按钮enable 2. 修改文本的内容后,[enable] 3. 解决字符乱码问题:utf-8 4. 提示:如果修改了文件没有保存的时候,又尝试打开新的文件,给出相关的提 ...
- Android+struts2+json方式模拟手机登录功能
涉及到的知识点: 1.Struts2框架的搭建(包括Struts2的jSON插件) 2.Android前台访问Web采用HttpClient方式. 3.Android采用JSON的解析. 服务端主要包 ...
随机推荐
- 理解npm、nvm、nodejs之间的关系
nvm nvm:nodeJs版本管理工具,管理nodejs版本和npm版本,使用nvm安装nodejs时会将npm一起安装下来 nodejs nodeJs: 一种高效的JavaScript运行环境 n ...
- Java 中的String、StringBuilder与StringBuffer的区别联系(转载)
1 String 基础 想要了解一个类,最好的办法就是看这个类的源代码,String类源代码如下: public final class String implements java.io.Seria ...
- [转帖]NUMA架构的CPU -- 你真的用好了么?
NUMA架构的CPU -- 你真的用好了么? 本文从NUMA的介绍引出常见的NUMA使用中的陷阱,继而讨论对于NUMA系统的优化方法和一些值得关注的方向. 文章欢迎转载,但转载时请保留本段文字,并置于 ...
- [转帖]TCP和UDP的135、137、138、139、445端口的作用
TCP和UDP的135.137.138.139.445端口的作用 https://www.cnblogs.com/IvanChen/p/4500698.html 竟然不知道 端口具体是干什么的.. 如 ...
- Windows10 等 administrator 打开IE 或者edge的方法
gpedit.msc 组策略处理即可
- MySQL简介及安装
一.DBA工作内容及课程体系 二.MySQL课程体系介绍 三.DBA的职业素养 四.MySQL简介及安装 01 什么是数据? 02 什么是数据库管理系统 03 数据库管理系统种类 04 MySQL发展 ...
- python爬虫scrapy之downloader_middleware设置proxy代理
一.背景: 小编在爬虫的时候肯定会遇到被封杀的情况,昨天爬了一个网站,刚开始是可以了,在settings的设置DEFAULT_REQUEST_HEADERS伪装自己是chrome浏览器,刚开始是可以的 ...
- 使用getopts处理输入参数
在编写shell脚本中,需要输入参数,使用过程中,getopts更加方便.可以很好的处理用户输入的参数和参数值. 参加如下一段脚本: #!/bin/bash while getopts ": ...
- 离线安装redis-cluster
#离线安装redis-cluster https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.5.tar.gz #安装ruby .tar.gz cd rub ...
- spring 注解 之 AOP基于@Aspect的AOP配置
Spring AOP面向切面编程,可以用来配置事务.做日志.权限验证.在用户请求时做一些处理等等.用@Aspect做一个切面,就可以直接实现. 1.首先定义一个切面类,加上@Component @A ...