在Java中经常看到这样的字眼

1.@Override

2.@Deprecated

3.@SuppressWarnings  

4.@SafeVarargs

5.@FunctionalInterface

很多小伙伴不知道什么意思,其实这是一种注解,注意是注解 ,不是“ // ”注释哦。

1. 什么是注解(百度百科)

注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值

注解也就是Annotation,相信不少人也和我之前一样以为和注释和doc一样,是一段辅助性的文字,其实注解不是这样的。

从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

2.基本的Annotation

java提供了5个基本的注解,分别是

1.@Override

2.@Deprecated

3.@SuppressWarnings
  

4.@SafeVarargs

5.@FunctionalInterface

  

1.限定父类重写方法:@Override

当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误

2.标示已过时:@Deprecated

这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线,这个见了不少了吧)。

3.抑制编译器警告:@SuppressWarnings

被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告,例如修饰一个类,那他的字段,方法都是显示警告

4.“堆污染”警告与@SafeVarargs

想理解这个就要明白什么是堆污染,堆污染是什么?

其实很好理解,就是把不带泛型的对象赋给一个带泛型的对象,为什么不行?很简单,因为不带泛型的话,默认会给泛型设定为object,意思就是什么类型都可以往里面塞,那你一个不带泛型的怎么可能给一个带泛型塞呢。

例如运行如下代码:

List list = new ArrayList(); list.add(20); List<String> ls = list; System.out.println(ls.get(0));则会抛出堆污染异常Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test.Test1.main(Test1.java:29)

注意:可变参数更容易引发堆污染异常,因为java不允许创建泛型数组,可变参数恰恰是数组。
  抑制这个警告的方法有三个:

1.@SafeVarargs修饰引发该警告的方法或构造器

2.使用@suppressWarnings("unchecked")

3.编译时使用-Xlint:varargs

5.函数式接口与@Functionallnterface

什么是函数式?如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)

接口体内只能声明常量字段和抽象方法,并且被隐式声明为public,static,final。

接口里面不能有私有的方法或变量。

这个注解有什么用?这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口

3.自定义注解

定义注解非常的简单,如下

public @interface Test{}

然后这个注解就可以用在别的地方

例如:

@Test

public class MyClass{}

这个自定义注解可以修饰程序中的类、方法、变量、接口等。通常放在所有修饰符之前。

你还可以为自己的注解类添加成员变量

例如:

public @interface MyTag{

//注解中的成员变量以方法的方式来定义

String name();

int age

}

然后

public class Test{

//当使用自定义注解的时候,这个注解本身是不会生效的,必须由开发者工具提取出来并进行处理。

@MyTag(name = "XX" , age = 6)

public void info(){}

}

你甚至还可以为成员变量指定初始值

public @interface MyTag{

String name() default "yeeku"

int age() default 32;

}

当你指定完默认值的时候,你可以直接@MyTag使用不需要带参数。

4.JDK的元Annotation

1.使用@Retention

这个注解是用来修饰注解定义的,作用是被修饰的注解可以保存多久,这个注解需要使用参数。

这个参数的类型是RetentionPolicy,所以使用这个注解就要对value赋值。

value的值有且仅有三个:

->RetenionPolicy.CLASS 编译器把该注解记录在class文件中。当运行java程序时,JVM不可获取注解信息。这是默认值!

->RetenionPolicy.RUNTIME编译器把该注解记录在class文件中。当运行java程序时,JVM可获取注解信息,程序可以通过反射获取该注解信息

->RetenionPolicy.SOURCE 该注解只保存在源代码中,编译器直接丢弃该注解

例如:@Retention(value =RetenionPolicy.SOURCE) 可简写为@Retention(RetenionPolicy.SOURCE)

2.使用@Target

@Target也只能修饰一个注解定义,作用是指定被修饰的注解能用于修饰哪些程序单元,@Target也包含了一个value值,他的值只能是下面的:ElementType.

取值 注解使用范围
METHOD 可用于方法上
TYPE 可用于类或者接口上
ANNOTATION_TYPE 可用于注解类型上(被@interface修饰的类型)
CONSTRUCTOR 可用于构造方法上
FIELD 可用于域上
LOCAL_VARIABLE 可用于局部变量上
PACKAGE 用于记录java文件的package信息
PARAMETER 可用于参数上

例如:

@Target(ElementType.METHOD) (这是简写)

public @interface Action()

上面就是他的用法,不过有个比较容易混淆的地方就是@interface和interface不是同一个东西:

@interface 不是interface,是注解类 是jdk1.5之后加入的,java没有给它新的关键字

,所以就用@interface 这么个东西表示了 这个注解类,就是定义一个可用的注解

,包括这个注解用于什么地方,是类,还是方法,还是property,还是方法入参等等

,还有这个注解是否编译后进入class 比如我们知道的用于javadoc的注解,是不进入class文件的。

然后在后面你就可以用这个注解写代码了。总的来说,这就是一个生成javadoc时用到的注释类

3.使用@Documented

这个注解用于指定被修饰的注解类将被javadoc工具提取成文档,如果定义注解类时使用了这个注解修饰,则所有使用该注解修饰的程序员苏API文档将会包含该注解说明。

例如:@Documentedpublic @interface Testable{}

4.使用@Inherited

这个注解指定被他修饰的注解将具有继承性——如果某个类使用了@Xxx,则其子类将自动被@Xxx修饰

5.使用@Result

作用是在同一个程序元素前使用多个相同类型的注解在java8之前只能通过@Results配置,

java8简化了它的写法例如:

@test(age=5)@test(age=8)public void resultTest(){}

6.使用类型注解

创建类实例new@InternedMyObject();

类型映射myString = (@NonNullString) str;

implements 语句中class UnmodifiableList<T> implements@ReadonlyList<@Readonly T> { ... }

throw exception声明void monitorTemperature() throws@CriticalTemperatureException { ... }

等等地方都可以用类型注解

新增ElementType.TYPE_USE和ElementType.TYPE_PARAMETER(在Target上)新增的两个注释的程序元素类型 ElementType.TYPE_USE 和 ElementType.TYPE_PARAMETER用来描述注解的新场合。ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中。

ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中(eg:声明语句、泛型和强制转换语句中的类型)。还是那句话,这些注解本身是没有意义的。要靠自己实现类型注解的检查框架,或者第三方,类型注解最大的意义在于,让编译器执行更严格的检查,保证代码更加的健壮。

“@” Java中的特殊符号——注解(Java中’@‘符号是什么意思?)相关推荐

  1. java中为什么要用注解_java中的注解,真的很重要,你理解了嘛?

    这篇文章开始讲解java中的注解,在平时的开发当中我相信你或多或少的接触过注解.比如你可能都见过@override,它代表的就是一个注解.但是,为了更加清晰的去介绍注解,我还是先给出一个例子,让你能够 ...

  2. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  3. Java注解中produces啥意思,注解@RequestMapping中的produces,consumes属性

    今天在项目中看到了@RequestMapping中有两个属性,consumes和produces,于是就想弄清楚这两个属性是干什么的. 一.produces 指定返回值类型,并且可以设置返回值类型和返 ...

  4. java 无符号 类型_java中符号类型和无符号类型的问题分析

    一 参考博文 二 java中的无符号数和有符号数 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 计算机中用补码表示数值:另外,用二进制的 ...

  5. java中spring的注解_spring中的各种注解解析

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  6. java编译时注解_简单介绍 Java 中的编译时注解

    1. 前言 上一篇 主要介绍了什么是 注解 (Annotation) 以及如何读取 运行时注解 中的数据, 同时用注解实现了简单的 ORM 功能. 这次介绍另一部分: 如何读取 编译时注解 ( Ret ...

  7. java字面量和符号引用_JVM中的直接引用和符号引用

    ​ 在JVM中,类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载7个阶段.而解析阶段即是虚拟机将常量池内的符号引用替换为直接引用的过程. ...

  8. java 无符号右移_java中的无符号移位运算

    1. 无符号右移   >>>  或 >>> = 无符号右移(>>>)跟右移(>>)运算符不一样. 右移不改变数的正负. 对于一个正数, ...

  9. java中的枚举与注解

    枚举的概述 枚举是 Java 中一种特殊的类(类型),它可以定义固定数量的枚举实例(此类的对象),例如: 性别.交通信号灯.季节等等 -> enum 枚举类的对象不是new出来的, 而是一一罗列 ...

最新文章

  1. 集成Netty|tensorflow实现 聊天AI--PigPig养成记(2)
  2. 小学生python入门-如何看待小学生开始学Python?
  3. 数据挖掘150道笔试题
  4. 异步编程异常和死锁处理
  5. linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
  6. Oracle 常用sql场景应用(未完待续......)
  7. 二鸟在林不如一鸟在手
  8. 安卓项目之微信公众好---初体验
  9. vue 自定义指令(directive)实例
  10. php自动加载 依赖,php自动加载
  11. netfilter 和 iptables
  12. 算法图解第四章笔记与习题(快速排序)
  13. vs2005编译apache2.2源码调试
  14. 汤家凤高等数学2020年基础课手写笔记汇总
  15. 本地HTML打不开 总打开360页面,彻底解决IE浏览器打不开网页时自动跳转到hao.360.cn导航页的问题-网络教程与技术 -亦是美网络...
  16. SEGGER_RTT、git偏僻问题常用解决方法
  17. 密码正确登入不了网络计算机,windows远程登录密码正确但登录不上
  18. oracle季度日均怎么算,求日均值,该如何处理
  19. Deepin、统信UOS等Linux系统连接Windows网络邻居的共享文件夹的方法
  20. Centos7.2安装搜狗拼音

热门文章

  1. 高性能Golang研讨会【精】
  2. 【FFmpeg】flv转码测试2: 24fps gop为24 恒定码率
  3. Android使用GoogleMap实现定位及定位回正
  4. 使用ADB命令卸载安卓设备上的应用
  5. 各种注释-注释多行与取消多行注释快捷键
  6. 【电子产品】ThinkPad S5 Intel R Dual Band Wireless-AC 3165 网卡驱动莫名
  7. matlab编写扫雷,【matlab编程】Matlab版扫雷
  8. ch.ethz.ssh2._MindTerm SSH客户端3.4版已发布
  9. FileNotFoundError: [Errno 2] No such file or directory: ‘ETHZ/eth01/images/image_00000001_2021-10-29
  10. 金庸群侠传3D重制版