碎碎念:
由于各种各样的原因,决定转行去当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来比较优雅实现对应功能。