
俗话说:工欲利其事必先利其器,一把好的工具,可以让我们不费吹灰之力,就可以达成一件事。
在我们JAVA的开发过程中,注解的创造,就是让我们花费很少的代码量,却可以解决复杂的问题,从而大大的提高我们的工作效率。
在SSM,SpringBoot,SpringClund以及其他的框架中,都含有这大量的注解,这可以说是对我们记忆力的考验啊!且对于英语不好的小伙伴来说,难度更是上了一层。
但,任何东西都是有迹可循,我们发现任何注解其底层都是由咱们JAVA中七个注解内置组成,我们只要搞懂JAVA中七个内置注解,其他的注解对咱们也会变为小菜一碟。
1.什么是注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。当然它也支持自定义 Java 标注。
说白了:注解就是一种简易的代码。
2.JAVA七个内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
在 java.lang 中的注解 作用在代码的注解是
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
public class Test1 {
@Override //重写方法
public String toString() {
return super.toString();
}
@Deprecated
public static void test2(){
System.out.println("这个方法是危险的,建议不使用");
}
@SuppressWarnings("all") //忽略警告
public static void test3(){
List list = new ArrayList();
}
public static void main(String[] args) {
test2();
}
}
在 java.lang.annotation 中 作用在其他注解的注解(或者说 元注解)是:
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。这个注解在创立注解中是必须有的。
@Documented - 标记这些注解是否包含在用户文档中。
@Target - 标记这个注解应该是哪种 Java 成员。也就是说明这个注解可以用在哪里,例如类上,方法,成员变量啊,这个注解在创立注解中是必须有的。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
因为元注解是在作用在注解上的,所以我们看一@Override,发现其上面就是我们的元注解,且注解@Retention和@Target这两个注解是必须有的。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
从 Java 7 开始,额外添加了 3 个注解: 但主要是上面这七个注解
@SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
3.自己定义注解
我们通过上面的学习,因为知道了,JAVA内置的注解只有七个,那么,我们是否可以设计自己的注解呢?
当然是可以的,因为元注解就是 作用在其他注解的注解。
注解的声明为:
@interface +自定义注解的名称+{
内部的参数的定义 : 类型 + 名字 + ()
当加入default时,为其赋予一个默认值,在使用时,可以不传值。
String name() default "";
特殊的情况 当你内部参数的名字为value时,你在赋值时,可以省略不写这个形参。
}
/*
* 自定义注解
* */
public class Test3 {
@MyAnnotation()
@MyAnnotation2("你哈")
public void test(){
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
//下面的两者注解 ,可以随着自己的要求来判断加不加
@Documented
@Inherited
@interface MyAnnotation{
String name() default "" ;
int age() default 0;
String[] hobby() default {"编程","听歌"};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
String value(); //当你在使用时,不写参数的名字时,默认为value
}
更多精彩内容 微信公众号 JAVA在左 美文在右 每日一篇啊