带你理解注解与自定义注解|小册免费学

457 阅读4分钟

前言

相信很多使用Java的小伙伴对于注解并不陌生,在Java生态中的各种流行框架里各种注解的应用更是让人眼花缭乱,但是有很多初学者对注解并不是很了解,本文的目的是尽量用通俗的语言帮助那些对注解不是很了解的小伙伴,让注解这个概念在脑海中形成一个初步的印象,以便与在后续的学习中更好的理解。

一、注解是什么

简单而言,注解可以理解为注释,但是他却跟注释有着十分本质的区别,注释通常只是用于提醒程序员这段代码是用来干什么的,为什么要这么写。而注解的作用更多的是给编译器一个提醒,告诉编译器这个地方被标识了,然后编译器进行相应的处理,比如我们经常看到的@Override就是告诉编译器这个方法是重写父类的方法,编译器就可以对此进行处理,比如发现方法签名不一致发出警告之类的。当然注解的作用不仅限于此,我们可以自定义属于我们自己的注解,通过我们定义的注解,来对程序的执行逻辑产生影响。由于注解的标识可以保留到运行期间,也就是说在程序运行时注解的信息还保留在所修饰的对象上,这时候我们可以通过代码在程序运行时动态的获取这个信息,以进行后续的处理。

二、自定义注解

好了,上面已经大概的介绍了一下注解的作用,接下来就让我们通过一个简单的实例来体验一下怎么自定义一个简单的注解。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ChangeYourMind {
    boolean isChange() default false;
}

@Retention(RetentionPolicy.RUNTIME)这个是Java提供的元注解,也就是给编译器看的,标识的意思是我的自定义注解会在运行时保留。

@Target(ElementType.METHOD)这个的意思是我这个注解只能放在方法上。

在注解中定义了一个isChange()的属性,这里有些同学就会有疑问了,这个不是一个方法吗?虽然看上去这是一个方法,但是实际上这个表示的是一个属性,我们可以直接调用这个方法来获取这个属性对应的值。

既然我们的自定义注解定义完了,接下来就是如何使用了。

刚刚我们说到,我们定义的注解是修饰在方法上的,所以我们定义一个测试类来看看我们自定义的注解ChangeYourMind怎么影响方法的执行。这个注解故名思议,加上后将会改变我们原有的执行逻辑.

public class Main {
    @ChangeYourMind(isChange = true)
    public static void  testMethod1() throws NoSuchMethodException {
        Method method = Main.class.getMethod("testMethod1");
        ChangeYourMind annotation = method.getAnnotation(ChangeYourMind.class);
        if (annotation != null) {
            boolean change = annotation.isChange();
            if (change) {
                System.out.println("I change my mind");
            } else {
                System.out.println("I do what i want");
            }
        } else {
            System.out.println("I don't know what to do!");
        }
    }
    @ChangeYourMind(isChange = false)
    public static void  testMethod2() throws NoSuchMethodException {
        Method method = Main.class.getMethod("testMethod2");
        ChangeYourMind annotation = method.getAnnotation(ChangeYourMind.class);
        if (annotation != null) {
            boolean change = annotation.isChange();
            if (change) {
                System.out.println("I change my mind");
            } else {
                System.out.println("I do what i want");
            }
        } else {
            System.out.println("I don't know what to do!");
        }
    }

    public static void  testMethod3() throws NoSuchMethodException {
        Method method = Main.class.getMethod("testMethod3");
        ChangeYourMind annotation = method.getAnnotation(ChangeYourMind.class);
        if (annotation != null) {
            boolean change = annotation.isChange();
            if (change) {
                System.out.println("I change my mind");
            } else {
                System.out.println("I do what i want");
            }
        } else {
            System.out.println("I don't know what to do!");
        }
    }

    public static void main(String[] args) throws NoSuchMethodException {
        testMethod1();
        testMethod2();
        testMethod3();
    }
}

程序的输出结果如下

I change my mind
I do what i want
I don't know what to do!

在这个类中我们通过反射获取注解,并且根据注解是否存在,isChange是否为true来对我们程序的逻辑进行影响。在有注解时,我们判断isChange是否为true,来决定是否要“改变主意”,在没有注解时,我们的程序不知道该干什么,相信看到这里大家对自定义注解已经有了大概的认识了吧!

三、总结

本文通过一个小案例来介绍自定义注解的大致用法,在很多中间件里都是通过这样的方式来获取注解里定义的属性来简化开发,如一些ORM框架,一些权限认证框架等等.关于这些框架的实现可能远比这复杂的多,但是大体的框架还是一样的,这些内容需要我们继续深入学习,大家一起加油吧!

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情