Day29 自定义注解+利用反射获取成员方法

自定义注解,该注解用来描述,方法运行所需的时间上限(用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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值