注解处理器练习题

题目要求

自定义注解,该注解用来描述,方法运行所需的时间上限(用long类型的数据表示时间,单位为ms),
然后,自定义注解处理器,运行加了运行时间上限注解的方法,判断方法的运行时间,
是否超出了注解中规定的时间上限,如果超过,则返回true,未超过返回false

实现代码

第一步:定义注解

package homework;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*自定义注解,该注解用来描述,方法运行所需的时间上限(用long类型的数据表示时间,单位为ms)*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RunTime {
    long maxRunTimeMillis();
}

第二步:定义目标类,以及目标类的run方法。注解作用在该类的run方法上。
目标类还包含main方法,用来测试注解处理器

package homework;

import java.lang.reflect.InvocationTargetException;

/*定义一个类,注解作用在该类的run方法上,run方法使用Thread.sleep()方法,控制运行时间*/
public class Work1 {
    public Work1(){}

    @RunTime(maxRunTimeMillis = 200)
    public void run() throws InterruptedException {
        Thread.sleep(300);
    }

    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, InterruptedException, IllegalAccessException {
        AnnotationProcess process = new AnnotationProcess();
        System.out.println("运行run方法,运行时间是否满足约束条件:200ms\n" + process.runTimeIllegal());
    }
}

第三步:定义一个注解处理器,实现的详细过程请看代码

package homework;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*然后,自定义注解处理器,运行加了运行时间上限注解的方法,判断方法的运行时间,
是否超出了注解中规定的时间上限,如果超过,则返回true,未超过返回false*/
public class AnnotationProcess {

    //处理器使用反射技术实现,反射技术的起点是Class。
    Class workClz;
    public AnnotationProcess() throws ClassNotFoundException {
        this.workClz = Class.forName("homework.Work1");
    }
    //此方法,返回目标类的运行时间是否满足约束。如果满足,返回true,不满足,返回false
    public boolean runTimeIllegal() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, InterruptedException {
        //利用反射获取目标类的run方法,并破解权限
        Method method = workClz.getDeclaredMethod("run");
        method.setAccessible(true);

        //利用反射技术,获取目标类的run方法的注解,以及注解信息。
        if(method.isAnnotationPresent(RunTime.class)){

            Annotation annotation = method.getAnnotation(RunTime.class);
            long maxRunTimeMillis = ((RunTime)annotation).maxRunTimeMillis();

            //运行run方法,并记录他的运行时间
            Constructor constructor = workClz.getDeclaredConstructor();
            Work1 work1 = (Work1) constructor.newInstance();
            long startTime = System.currentTimeMillis();
            method.invoke(work1);
            long endTime = System.currentTimeMillis();
            long time = endTime - startTime;

            //判断实际运行时间,是否满足约束条件
            if(time > maxRunTimeMillis){
                return false;
            }
        }
        return true;
    }
}

在这里插入图片描述

在Spring Boot项目中,注解处理器(Annotation Processors)是一种特殊类型的Java类,它们能够自动处理源代码级别的注解信息。配置SpringBoot的注解处理器通常涉及以下几个步骤: 1. **启用注解处理器支持**:在`application.properties`或`application.yml`文件中添加以下配置: ```properties spring.factories EnableAutoConfiguration=org.springframework.boot.autoconfigure_processor.AnnotationProcessorConfiguration ``` 2. **编写注解处理器**:创建一个实现了`javax.annotation.processing.Processor`接口的Java类,该类负责处理特定的注解。例如,如果你有一个自定义的@Mapper注解,你要提供一个处理器来生成相应的映射代码。 3. **注册处理器**:在处理器类所在的模块的主类上添加`@EnableProcessors({YourCustomAnnotationProcessor.class})`,这里`YourCustomAnnotationProcessor`替换为你实际的处理器类名。 4. **Maven或Gradle配置**:确保在构建工具(如Maven或Gradle)的设置中正确扫描到注解处理器所在的包路径。例如,如果处理器在`com.example.myproject.annotations`包下,要在pom.xml(Maven)或build.gradle(Gradle)中添加对应的扫描范围。 ```xml <!-- Maven --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <additionalClasspathElements> <additionalClasspathElement>${project.build.outputDirectory}</additionalClasspathElement> </additionalClasspathElements> </configuration> </plugin> </plugins> </build> // Gradle tasks.withType(JavaCompile) { options.annotationProcessingOptions ProcessorOptions.includeCompileClasspath = true } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值