碎碎念:
由于各种各样的原因,决定转行去当java开发(拉稀大数据毁我青春)。好了,接下来进入正题

注解

注解算是不知道java版本什么引进来的一个新特性,一个特点是@关键字,就能够增强代码。类似于我们继承代码时写的@Override以及springboot的老朋友@Controller,还有lombok常用的@Data之类注解。某些教材上会说,“注释时写给人看的,告诉程序员这段代码要干嘛;注解是写给编译器干的,告诉编译器接下来要干嘛。”这一句话虽然不能算错,但确实听不懂他想说啥。

注解的开发

java的注解其实主要需要实现@interface方法
具体示例如下

package annoation;

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 InitMethod {
}

我们可以看到整个代码由三部分的构成,其中

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)

这两个是描述注解的注解,也就是元注解
当然元注解不止这些,具体可以看
https://blog.csdn.net/xtho62/article/details/113816008
那么又说回来,我们会看到注解里面并没有实现任何方法,那我们到底要怎么实现其具体的功能呢?

反射

实现功能一定要依赖于java的反射机制。让我们来看一段关于反射的代码

package main;

import annoation.InitMethod;
import test.echo;

import java.lang.reflect.Method;

public class AnnotationTest {
    public static void main(String[] args) throws ClassNotFoundException {
//        Class clazz = Class.forName("test.echo");
//        Class clazz = echo.class;
        echo echo = new echo();
        Class clazz = echo.getClass();
        Method[] methods = clazz.getMethods();
        for(Method i : methods){
            boolean temp = i.isAnnotationPresent(InitMethod.class);
            if(temp){
                System.out.println("got initMethod");
            }
            System.out.println(i.getName());
        }
    }
}

我们通过的反射的方法,获得类里面的方法,然后再通过method进行判断对代码进行额外的增强。当然我这个实现是非常粗糙的,实际上如果我们依赖springboot的话,可以用Aspect来比较优雅实现对应功能。

参考连接:
https://www.bilibili.com/video/BV1Py4y1Y77P