- 写一个注解类,该注解类里有定义一个属性 叫做timeout,用来配置函数的运行超时时间。该注解只能用在方法上。
写一个类,里面有个方法,该方法实现打印1到100的数字。
该方法上使用上面的注解,配置该方法的运行超时时间。
再写一个注解类的处理程序,把方法上的注解拿到,并记录方法的执行时间,看看该方法是否超时。
代码如下
- 自定义的注解TimeAnnation
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeAnnation {
public long timeout() default Integer.MAX_VALUE;
}
- 打印类Printf
public class Printf {
@TimeAnnation(timeout=5)
public void pr() {
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
}
}
- 主方法
public class Main {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
//反射解析注射属性
Class class1=Printf.class;
Method[] methods=class1.getMethods();
for (Method method : methods) {
//从该方法获取Time注解
TimeAnnation tt=method.getAnnotation(TimeAnnation.class);
if (tt!=null) {
long outTime=tt.timeout();//获取超时时间
long startTime=System.currentTimeMillis();
method.invoke(class1.newInstance(), null);//填充
long endTime=System.currentTimeMillis();
long usename=endTime-startTime;//获取使用时间
System.out.println("设定的超时时间是:"+outTime+"ms");
System.out.println("打印1到100使用的时间是:"+usename+"ms");
if (usename>outTime) {
System.out.println("超时!");
}else {
System.out.println("未超时!");
}
}
}
}
}
- 运行结果例子