java实现自定义注解并模拟密码验证功能

本文详细介绍自定义Java注解的实现方法,包括定义注解、注解的生效范围及使用限制,通过实例演示注解在方法上的应用,并展示如何通过反射读取注解内容。

学习java的时候总是看见这些注解:@Override,@SuppressWarnings(“unused”)等,平时只知道怎么用,但是不知道如何实现的,今天学习了下,将自己的学习结果分享下,以下以一个小的例子来说明下如何定义自己的注解

1.要实现自定义注解需要通过@interface的方式进行定义,定义注解的语法:

public @interface AnnoName{ 修饰符 数据类型 变量名称();}

这里变量名后面必须用();变量的修饰符可以省略,以下是自己定义的一个注解:

/**
 * @ClassName: Logininfo
 * @Description:自定义注解Logininfo
 * @Author: 
 * @Date: 2019/6/3
 */
@Documented
@Retention(RetentionPolicy.RUNTIME) //定义注解的生效范围
@Target(value= ElementType.METHOD) //表明此注解针对方法有效
public @interface Logininfo { //定义自己的注解名字为:Logininfo

    String name() default "";
    String password() default "";
}

以上自定义的注解还用到了其他三个注解,这里介绍下其作用:
1.@Retention(RetentionPolicy.RUNTIME):

这个注解的作用主要是说明自定义注解的生效范围,它主要有三个值:

(1)SOURCE:此注解的信息只会保存在源文件中,编译时会被编译器丢弃

(2)CLASS:编译器会将注释记录在类文件中,但是不会被加载到JVM,如果一个注解声明时没有指定范围,默认的就是CLASS

(3)RUNTIME:此注解类型的信息会被保存到源文件,类文件中,同时执行的时候也会被加载到JVM中,此注解可以用利用反射读取其内容

2.@Target(value= ElementType.METHOD):

此注解声明自定义的注解使用的范围,使用在类上,方法上还是参数上,这个注解中存在一个ElementType[]类型的变量,可以用于指定自定义注解的使用限制,它主要有以下几个值:

(1)ANNOTATION_TYPE:只能用在注释的声明上;

(2)CONSIRUCTOR:只能用在构造方法的声明上;

(3)FOELD:只能用在字段的声明上,包含枚举变量;

(4)LOCAL_VARIABLE:只能用在局部变量的声明上;

(5)METHOD:只能用在方法的声明上;

(6)PACKAGE:只能用在包的声明上;

(7)PARAMEIER:只能用在参数的声明上;

(8)TYPE:只能用在类、接口、枚举类型上

3.@Documented

它可以将自定义的注解设置为文档说明信息,因此生成javadoc文档的时候会将此注解的信息加入到文档中。

除了以上三个还有一个注解:

4.@Inherited

此注解用于标注一个父类的注解是否可以被子类继承,如果一个注解需要被子类所继承,在声明的时候直接加上@Inherited即可

下面以一个小例子测试下刚才自定义注解@Logininfo的用法:

定义一个CheckLogin类,其中定义一个判断用户名和密码的方法login(),通过自定义的注解设置默认值

/**
 * @ClassName: CheckLogin
 * @Description: 自定义注解的运用
 * @Author: 
 * @Date: 2019/6/4
 */
public class CheckLogin {

    /*
     * @Author 
     * @Description  通过方法运用刚才自定义的注解,通过接收参数判断用户输入的用户名和密码和给定 
        的用户名和密码是否一致
     * @Date 2019/6/4
     * @Param [name, password]
     * @return boolean
     **/
    @Logininfo(name="add",password="123") //设置默认的用户名和密码
    public boolean login(String name,String password) throws Exception {
        //获取注解中参数的内容
        // 1.获取方法
        Method method = CheckLogin.class.getMethod("login", String.class, String.class);
        // 2.获取方法中的注解对象
        Logininfo logininfo = method.getAnnotation(Logininfo.class);
        // 3.获取注解中的参数值
        String uname = logininfo.name();
        String upwd = logininfo.password();
        // 4.比较二者的值
        if(name.equals(uname) && password.equals(upwd)){
            //如果二者相等,返回true
            return true;
        }
        // 否则返回false
        return false;
    }
}

对login()方法进行测试:

/**
 * @ClassName: LoginMain
 * @Description:测试自定义注解
 * @Author: 
 * @Date: 2019/6/4
 */
public class LoginMain {

    public static void main(String[] args) throws Exception {

        CheckLogin cl = new CheckLogin();
        //控制台输入用户名,密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String uname = sc.next();
        System.out.println("请输入密码:");
        String upwd = sc.next();
        //调用login方法
        boolean b = cl.login(uname, upwd);
        if(b){
            System.out.println("密码验证成功!");
        }else{
            System.out.println("密码验证失败!");
        }

    }
}

以下是测试结果:

1.用户名和密码不一致的情况:

请输入用户名:
123
请输入密码:
132
密码验证失败!

2.用户名和密码相同的情况:

请输入用户名:
add
请输入密码:
123
密码验证成功!

以上是个人对于自定义注解的学习分享,有问题欢迎大家提出。

### 在 Spring Boot 中自定义注解结合元注解实现特定功能 #### 1. 自定义注解的组成部分 自定义注解通常由以下几个部分组成: - **元注解**:定义注解的作用范围、生命周期等。 - **属性**:为注解提供可配置的参数。 - **目标类型**:通过 `@Target` 指定注解可以使用的元素类型,例如类、方法或字段。 - **保留策略**:通过 `@Retention` 指定注解的生命周期,例如仅在源代码阶段有效或运行时有效。 #### 2. 元注解的使用 以下是常用的元注解及其作用: - **@Target**:定义注解可以修饰的目标类型。例如,`ElementType.METHOD` 表示注解只能用于方法[^2]。 - **@Retention**:定义注解的生命周期。例如,`RetentionPolicy.RUNTIME` 表示注解在运行时可用[^2]。 - **@Documented**:表示注解会被包含在 JavaDoc 文档中。 - **@Inherited**:表示注解可以被子类继承。 - **@Repeatable**:允许同一个元素上重复使用相同的注解。 #### 3. 示例:自定义注解结合元注解实现日志记录功能 以下是一个完整的示例,展示如何通过自定义注解 AOP 实现方法执行时间的日志记录功能。 ##### 定义自定义注解 ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 定义注解的目标为方法,保留策略为运行时 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LogExecutionTime { // 可以添加更多属性,例如日志级别或消息模板 } ``` ##### 创建切面类 通过 AOP 拦截标记了 `@LogExecutionTime` 的方法,记录其执行时间。 ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Around("@annotation(LogExecutionTime)") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); // 执行目标方法 long endTime = System.currentTimeMillis(); String methodName = joinPoint.getSignature().toShortString(); System.out.println(String.format("Method %s executed in %d ms", methodName, (endTime - startTime))); return result; } } ``` ##### 使用自定义注解 在需要记录执行时间的方法上添加 `@LogExecutionTime` 注解。 ```java import org.springframework.stereotype.Service; @Service public class MyService { @LogExecutionTime public void doSomething() { try { Thread.sleep(1000); // 模拟耗时操作 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } ``` ##### 测试自定义注解 创建一个测试类来验证自定义注解功能。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class AppRunner implements CommandLineRunner { private final MyService myService; @Autowired public AppRunner(MyService myService) { this.myService = myService; } @Override public void run(String... args) throws Exception { myService.doSomething(); // 调用带有 @LogExecutionTime 注解的方法 } } ``` #### 4. 分析 当应用程序启动时,`MyService#doSomething` 方法会被拦截,AOP 切面会计算方法的执行时间打印到控制台。此过程展示了如何通过自定义注解注解实现特定功能。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值