自定义注解,该注解用来描述,方法运行所需的时间上限
用long类型的数据表示时间,单位为ms;
然后,自定义注解处理器,运行加了运行时间上限注解的方法,判断方法的运行时间,是否超出了注解中规定的时间上限,如果超过,则返回true,未超过返回false
1 package annotation;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.lang.reflect.Method;
5
6 public class Work {
7 public static void main(String args[]) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
8
9 //第一步,拿到目标方法的运行的时间上限
10 Class testTimeLimitClass = TestTimeLimit.class;
11 //第二步,利用Class对象,获取目标方法Method对象
12 Method reflectMethodRun = testTimeLimitClass.getDeclaredMethod("run");
13 //第三步,从Method对象上,判断方法上有没有目标类型注解, 如果有,获取该注解实例(利用isAnnotationPresent 方法)
14 if(reflectMethodRun.isAnnotationPresent(RunTimeLimit.class)){
15 //从注解实例上,获取方法运行的时间上限值(getAnnotation 方法获取)
16 RunTimeLimit runTimeLimit = reflectMethodRun.getAnnotation(RunTimeLimit.class);
17 long value = runTimeLimit.value();
18
19 //第四步,运行目标方法,计算方法的实际运行时间
20 reflectMethodRun.setAccessible(true);
21
22
23 //运行目标方法(java语言知识调用方法,利用反射也可以),这里用反射
24 TestTimeLimit obj = new TestTimeLimit();
25 long startTime = System.currentTimeMillis();
26 reflectMethodRun.invoke(obj);
27 long endTime = System.currentTimeMillis();
28 System.out.println("value="+value+", startTime="+startTime+", endTime="+endTime);
29 //第五步,方法的实际运行时间,是否超出注解规定的上限
30 if((endTime-startTime)>value){
31 throw new IllegalCallerException("非法方法调用运行异常"+"run");
32 }
33
34 }
35
36
37 }
38 }
1 package annotation;
2
3 import java.lang.annotation.Retention;
4 import java.lang.annotation.RetentionPolicy;
5
6 @Retention(RetentionPolicy.RUNTIME) //说明注解的保留级别,默认是在.class阶段,执行时不会运行注解相关;所以要设置位Runntime
7 public @interface RunTimeLimit {
8 //定义一个属性,来描述,方法运行时间的上限
9 long value();
10 }
1 package annotation;
2 /*
3 1. 自定义注解,该注解用来描述,方法运行所需的时间上限(用long类型的数据表示时间,单位为ms),
4 然后,自定义注解处理器,运行加了运行时间上限注解的方法,判断方法的运行时间,
5 是否超出了注解中规定的时间上限,如果超过,则返回true,未超过返回false
6 */
7
8
9 public class TestTimeLimit {
10 @RunTimeLimit(100)
11 public void run() throws InterruptedException {
12 Thread.sleep(300);
13 }
14 }