Java注解

1.注解的理解

  1. 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息
  2. 和注释一样,注解不影响程序逻辑,但注解可以被编译或者运行,相当于嵌入在代码中的补充信息
  3. 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

基本的Annotation介绍:

使用Annotation时要在其前面添加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素

  • 三个基本的Annotation:

    • @Override:限定某个方法,是重写父类方法,该注释只能用于方法

    • @Deprecated:用于表示某个程序元素(类、方法等)已过时

    • @SuppressWarnings:抑制编译器警告

2.@Override注解

例子:

package li.annotation;

public class Override_ {
public static void main(String[] args) { }
}
class Father{//父类
public void fly(){
System.out.println("Father fly ...");
}
} class Son extends Father{//子类 //@Override 放在fly方法上,表示子类的fly方法重写了父类的fly方法
//即使这里没有写@Override,其实还是重写了父类方法
//但是如果写了@Override注解,编译器就会检查该方法是否整的重写了父类的方法。
//如果的确重写了就编译通过,如果没有构成重写则编译错误
//它的意义就在于语法的校验
@Override
public void fly(){
System.out.println("Son fly ...");
}
}

@Override使用说明:

  1. @Override表示指定重写父类的方法(从编译层面验证),如果父类没有fly方法,则会报错
  2. 如果不写@Override注解,而父类仍有 public void fly(){},仍然构成重写
  3. @Override只能修饰方法,不能修饰其他类、包、属性等等
  4. 查看@Override注解源码为@Target(ElementType.METHOD),说明只能修饰方法
  5. @Target是修饰注解的注解,称为元注解

点击@Override进去可以看到Override的定义:

补充说明:@interface的说明

@interface不是接口,是注解类 ,在JDK1.5之后加入的

3.@Deprecated注解

Deprecated用于表示某个程序元素(类、方法等)已经过时

例子:

package li.annotation;

public class Deprecated_ {
public static void main(String[] args) {
AAA a = new AAA();
a.hi();
System.out.println(a.n1); }
} // @Deprecated 修饰某个元素,表示该元素已经过时
// 即 不再推荐使用,但是仍然可以使用
@Deprecated
class AAA{ @Deprecated
public int n1 = 10; @Deprecated
public void hi(){
}
}

查看@Deprecated注解类的源码:

@Deprecated使用说明:

  1. 用于表示某个程序元素(类、方法等)已过时
  2. @Deprecated可以修饰CONSTRUCTOR(构造器), FIELD(属性), LOCAL_VARIABLE(局部变量), METHOD(方法), PACKAGE(包), PARAMETER(参数), TYPE(类型)
  3. @Deprecated的作用可以做到新旧版本的兼容和过渡

3.@SuppressWarnings注解

@SuppressWarnings属性介绍及属性说明:(部分)

属性 属性说明
all 抑制所有警告
boxing 抑制装箱、拆箱操作时候的警告
cast 抑制映射相关的警告
dep-ann 抑制启用注释的警告
deprecation 抑制过期方法警告
fallthrough 抑制确在switch中缺失breaks的警告
finally 抑制finally模块没有返回的警告
hiding 抑制与隐藏变数的区域变数相关的警告
incomplete-switch 忽略没有完整的switch语句
nls 忽略非nls格式的字符
null 忽略对null的操作
rawtypes 忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
restriction 抑制使用不建议或禁止参照相关的警告
serial 抑制与实现序列化的类遗漏serialVersionUID的的警告
static-access 抑制不正确的静态访问方式警告
synthetic-access 抑制子类没有按最优方法访问内部类的警告
unchecked 抑制没有进行类型检查操作的警告
unqualified-field-access 抑制没有权限访问的域的警告
unused 抑制没被使用过的代码的警告

例子:

package li.annotation;

import java.util.ArrayList;
import java.util.List; // 1.当我们不希望看到警告时,可以使用@SuppressWarnings注解来抑制警告信息
// 2.在{""}中,可以写入你希望抑制(不显示)的警告信息
// 3.@SuppressWarnings的作用范围和你放置的位置有关
// 比如 @SuppressWarnings放置在main方法,那么抑制警告的范围就是main方法 public class SuppressWarnings_ {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("mary");
list.add("Bob");
System.out.println(list);//[jack, mary, Bob] }
}

查看@SuppressWarnings源码:

  1. @SuppressWarnings可以放置的位置有:TYPE(类型), FIELD(属性), METHOD(方法), PARAMETER(参数), CONSTRUCTOR(构造器), LOCAL_VARIABLE(局部变量)

  2. 该注解类有一个数组String[] value(),通过该数组可以在@SuppressWarnings({""})中设置多个属性,如@SuppressWarnings({"rawtypes","unchecked","unused"});

4.元注解

元注解的基本介绍:

JDK的元Annotation用于修饰其他Annotation

元注解的种类:

  1. Retention:指定注解的作用范围,三种:SOURCE,CLASS,RUNTIME

  2. Target:指定注解可以在哪些地方使用

  3. Documented:指定该注解是否会在javadoc中体现

  4. Inherited:子类会继承父类注解

4.1@Retention注解

说明:

只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

​ @Rentention的三种值:

  1. RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注解
  2. RetentionPolicy.CLASS:编译器把注解记录在class文件中,当运行Java程序时,JVM不会保留注解。这是默认值
  3. RetentionPolicy.RUNTIME:编译器把注解记录在class文件中,当运行Java程序时,JVM会保留注解。程序可以通过反射来获取该注解

4.2@Target注解

基本说明:

用于修饰Annotation定义,用于指定 被修饰的Annotation可以用于修饰 哪些程序元素

@Target也包含一个名为value的成员变量

@Documented
@Retention(RetentionPolicy.RUNTIME)//它的作用范围是RUNTIME
@Target(ElementType.ANNOTATION_TYPE)//这里的ANNOTATION_TYPE 说明@Target只能修饰注解
public @interface Target {//注释类
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}

4.3@Documented注解

基本说明:

@Documented:用于指定被该元Annotation修饰的Annotation类将被 javadoc工具提取生成文档,即在生成文档时,可以看到该注解。

PS:定义为@Documented的注解必须设置Retention值为RUNTIME

4.4@Inherited注解

被它修饰的Annotation将具有继承性,如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解

day30-注解的更多相关文章

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  3. Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

    前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...

  4. Android注解使用之注解编译android-apt如何切换到annotationProcessor

    前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...

  5. spring注解源码分析--how does autowired works?

    1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...

  6. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

  7. ASP.NET MVC5----常见的数据注解和验证

    只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...

  8. 基于注解的bean配置

    基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 &l ...

  9. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...

  10. Spring MVC注解开发入门

    注解式开发初步 常用的两个注解: @Controller:是SpringMVC中最常用的注解,它可以帮助定义当前类为一个Spring管理的bean,同时指定该类是一个控制器,可以用来接受请求.标识当前 ...

随机推荐

  1. 批处理(bat、cmd)命令总结

    2021-07-21 初稿 注释与回显 rem 回显 @取消单行回显 rem 注释有三种方式 :: %content% rem rem @取消单行回显,echo off取消后面的回显 @echo of ...

  2. WPF开发随笔收录-DrawingVisual绘制高性能曲线图

    一.前言 项目中涉及到了心率监测,而且数据量达到了百万级别,通过WPF实现大数据曲线图时,尝试过最基础的Canvas来实现,但是性能堪忧,而且全部画出来也不实际.同时也尝试过找第三方的开源库,但是因为 ...

  3. zabbix监控钉钉报警

    1. bash脚本 #!/bin/bash to=$1 subject=$2 text=$3 #此处的 xxxxx 就是刚刚复制存留的 api 接口地址. curl -i -X POST \ 'htt ...

  4. 【Java面试】什么是 ISR,为什么需要引入 ISR

    Hi,大家好,我是Mic. 一个工作5年的粉丝,在简历上写精通Kafka. 结果在面试的时候直接打脸. 面试官问他:"什么是ISR,为什么需要设计ISR" 然后他一脸懵逼的看着面试 ...

  5. # Vue3 toRef 和 toRefs 函数

    Vue3 toRef 和 toRefs 函数 上一篇博文介绍了 vue3 里面的 ref 函数和 reactive 函数,实现响应式数据,今天主要来说一下 toRef 函数和 toRefs 函数的基本 ...

  6. 微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹

    之前的文章中我们介绍了如何通过 Nocalhost 快速开发 Rainbond 上的微服务,介绍了基本的开发流程. 本文将续接上文继续介绍,使用 Nocalhost 开发配置文件 实现以下内容: 一键 ...

  7. LinkedList集合和Vector集合

    LinkedList集合数据存储的结构是链表结构.方便元素添加.删除的集合.实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法 LinkedList ...

  8. Python语法糖,提升编程幸福感!!!

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/a52bc938.html 大家好,我是测试蔡坨坨. 今天,我们来盘点一下Python中的那些语法糖. 什么是语法糖?语法糖不 ...

  9. 项目中使用@Transactional需要注意的点

    项目如果是Spring Boot.或者Spring Cloud,切记需要在启动类上加入@EnableTransactionManagement该注解.否则事务不生效. @Transactional是一 ...

  10. VMare 设置固定IP和网段

    切换目录 cd /etc/sysconfig/network-scripts ls查看当前目录下的东西 找到ipcfg- 开头的,而且不是iocfg-lo,而上图就是那个ifcfg-ens33. 则进 ...