Java注解
在Spring boot以及Spring Cloud的开发中用到了大量的注解,但是一直对注解的使用和基本工作原理不太了解。因此专门花点时间学习和整理Java注解的相关知识。主要涉及注解是什么,使用注解的好处,Java中如何使用注解以及注解的基本原理。其中重点是使用和基本原理。
注解是什么
JDK1.5开始提供注解。java.lang.annotation.Annotation
接口中有这么一句话,用来描述注解。注解的本质就是一个继承了Annotation接口的接口。比如:@Overrided
等价于
public interface Override extends Annotation{}
注解本质意义上拉说只是一种特殊的注释,需要有解析他的代码才能实现一些特殊的功能。
为什么要使用注解
最重要一点提升开发效率。注解都在class文件中,方便于源代码一起维护,并且在编译期就能验证正确性,方便排错。
如何使用注解
- Java内置的注解(元注解):
@Target
:注解的作用目标
@Retention
:注解生命周期
@Documented
: 注解是否应该包含在JavaDoc中。
@Inherited
: 注解是否允许子类继承。
-
自定义注解:自定义注解的使用非常简单:
-
定义注解:
@Target(value = {ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MessageUtil { String message() default "hello"; }
-
定义注解处理器
public class MessageUtilHandler { public void parse(Class<?> clazz) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //通过反射获取类 final Object object = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{}); final Method[] methods = clazz.getDeclaredMethods(); for(final Method method:methods){ MessageUtil messageUtil = method.getAnnotation(MessageUtil.class); if(null!=messageUtil){ //方法调用 method.invoke(object,messageUtil.message()); } } }
-
扫描方法上的注解,然后调用注解修饰的方法,这里最重要的是注解处理器。注解处理器决定了注解的行为。
详细代码上传到github中。参见:
注解的基本原理
注解的本质是继承了Annotation接口的接口。当我们通过getAnnotation方法获取注解。其本质是通过动态代理机制生成一个实现注解接口的代理类。这个有时间在找机会单独写一篇文章。