什么是注解
随着现在的轮子越来越成熟,框架也越来越丰富,特别是springboot的推出,很多人可以通过一个简单的注解就可以节省掉很多的工作。那什么是注解呢?
大家都知道注释,注释是解释代码的意图,是给人看的。但是注解是给代码看的,注解大概的意思给我们的方法或者类打上一个标签,然后就可以通过反射之类的东西拿到反射的信息,然后进行处理。
注解的使用流程
注解的使用有三个步骤,分别是:定义注解、使用注解、读取注解。如下图:
定义一个注解来学会注解
import java.lang.annotation.*;
/**
* 元注解:简单地来说就是可以用来java用来提供注解其他注解的注解(有点拗口,大概意思就是标记来给JVM或者编译器看的)
* java目前提供5种元注解:Target,Retention,Documented,Inherited,Repeatable(下面都用在自定义注解ANO上)
*/
/**
* 表示注解可以用于哪些地方(如果没有指定,默认是所有地方)。可能的 ElementType 参数包括:
* CONSTRUCTOR:构造器的声明
* FIELD:字段声明(包括 enum 实例)
* LOCAL_VARIABLE:局部变量声明
* METHOD:方法声明
* PACKAGE:包声明
* PARAMETER:参数声明
* TYPE:类、接口(包括注解类型)或者 enum 声明
*/
//@Target(ElementType.TYPE)
/**
* 表示注解信息保存的时长(如果没有指定,默认是RetentionPolicy.CLASS,如果是通过反射获取的话,这个需要声明为RUNTIME)。可选的 RetentionPolicy 参数包括:
* SOURCE:注解将被编译器丢弃
* CLASS:注解在 class 文件中可用,但是会被 VM 丢弃。
* RUNTIME:VM 将在运行期也保留注解,因此可以通过反射机制读取注解的信息。
*/
@Retention(RetentionPolicy.RUNTIME)
/**
* 将此注解保存在 Javadoc 中
*/
@Documented
/**
*允许子类继承父类的注解
*/
@Inherited
/**
* 允许一个注解可以被使用一次或者多次(Java 8)。
* 可参考(https://cloud.tencent.com/developer/article/1579167)
*/
//@Repeatable(A.class)
/**
* 注意:不能使用extends继承注解,也就是说注解不支持继承,@Inherited只是子类继承父类的注解,
* 不是子注解继承父注解。可以用父注解来注解子注解,来实现继承的效果。
*/
public @interface ANO {
/**
* 注解元素可用的类型如下所示:
* 所有基本类型(int、float、boolean等)
* String
* Class
* enum
* Annotation
* 以上类型的数组
*/
String value0() default "...";//用default指定默认值
}
其他常用注解:
@Override 表示当前方法覆盖了父类的方法
@Deprecation 表示方法已经过时,方法上有横线,使用时会有警告。
@SuppviseWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)**
如何读取注解
public class Main {
public static void main(String[] args) throws Exception {
Class<UseAno> clazz = UseAno.class;
//获取类上的注解
System.out.println(clazz.getAnnotation(ANO.class).value0());
//获取成员变量的注解
System.out.println(clazz.getField("field").getAnnotation(ANO.class).value0());
//获取方法上的注解
System.out.println(clazz.getMethod("getField",null).getAnnotation(ANO.class).value0());
}
}
@ANO(value0 = "class-ano")
class UseAno {
@ANO(value0 = "field-ano")
public String field;
@ANO(value0 = "method-ano")
public String getField() {
return field;
}
}
写在最后
其实注解大概就是这样,三部曲,先定义一个自定义的注解,在自己需要的地方打上注解,然后读取注解,再进行其他的逻辑操作,其中读取一般也是利用反射,得到类名、成员变量和方法之类的,读取注解信息来进行操作。如果想要更深入,可以看java编程思想.和自定义Junit框架。