你是否还在因JAVA注解感到困惑?看完这一篇让你彻底告别注解小白。

photo-1583462154515-30afdab0f34f.jpg

俗话说:工欲利其事必先利其器,一把好的工具,可以让我们不费吹灰之力,就可以达成一件事。

在我们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在左 美文在右 每日一篇啊

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容