自定义注解,该注解用来描述,方法运行所需的时间上限(用long类型的数据表示时间,单位为ms), 然后,自定义注解处理器,运行加了运行时间上限注解的方法,判断方法的运行时间, 是否超出了注解中规定的时间上限,如果超过,则返回true,未超过返回false.
/**
* 自定义注解,定义方法超过的时间
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface TimeLimitation {
//定义运行时间的上限
long timeLimit();
}
public class day29 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//拿到目标方法运行的时间上限
Class<TextTimeLimit> textTimeLimitClass = TextTimeLimit.class;
Method run = textTimeLimitClass.getDeclaredMethod("run");
//绕过权限检查
run.setAccessible(true);
//从Method对象上,判断方法上有没有目标类型的注解,如果有获取该注解实例
TimeLimitation runAnnotation = run.getAnnotation(TimeLimitation.class);
//获取注解实例的属性值即时间上限
long timeLimit = runAnnotation.timeLimit();
//运行目标方法,计算方法实际运行的时间(结束-开始)
long startTime = System.currentTimeMillis();
//执行方法(利用反射创建目标对象)
Object obj = textTimeLimitClass.newInstance();
run.invoke(obj);
long endTime = System.currentTimeMillis();
//求出运行时间
long runTime = endTime - startTime;
//判断方法的实际运行时间是否超出了注解规定的上限
if (runTime > timeLimit) System.out.println(true);
else System.out.println(false);
}
}
class TextTimeLimit {
//一个方法(运行时间可以自定义,便于检验注解)
@TimeLimitation(timeLimit = 200)//在被测试的方法上添加注解表示该方法允许运行的时间上限
public static void run() throws InterruptedException {
Thread.sleep(100);
}
}
思路:
1.创建一个自定义的注解,其中:
@Retention(RetentionPolicy.RUNTIME)//(定义注解的保留级别)jvm在运行时,也会保留注解信息
@Target(ElementType.METHOD)//(声明和限定注解使用的地方)定义在成员方法上
然后进行测试.
2.创建一个含有测试方法的类(熟悉反射的操作)
3.利用反射技术获取该方法,然后运行,结束时间 - 开始时间即为方法的运行时间,然后与注解定义的时间相比较,超过返回true,没有超过返回false.