首页 > 其他分享 >注解的优点?元注解?

注解的优点?元注解?

时间:2024-08-27 20:36:49浏览次数:11  
标签:Authority 类型 编译器 优点 修饰 注解 public

介绍

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。主要作用如下:

  • 编写文档——通过注解中标识的元数据可以生成doc文档,这是最常见的,也是java 最早提供的注解。常用的有@param @return 等

  • 代码分析——通过注解中标识元数据对代码进行分析。跟踪代码依赖性,实现替代配置文件功能。

  • 编译检查——通过注解中标识的元数据,让编译器能够实现基本的编译检查,例如@Override重写,如果这个方法并不是覆盖了超类方法,则编译时就能检查出。

这么来说是比较抽象的,具体看下注解的常见分类:

  • Java自带的标准注解,包括@Override 、@Deprecated 和 @SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。

  • 元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited 和 @Documented;@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。

  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

Java内置注解

Java 1.5开始自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings:

  • @Override :表示当前的方法定义将覆盖父类中的方法

  • @Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告

  • @SuppressWarnings:表示关闭编译器警告信息

@Override

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
	public @interface Override {
}

从源码中看到,这个注解可以被用来修饰方法,并且它只在编译时有效,在编译后的class文件中便不再存在。这个注解的作用就是告诉编译器被修饰的方法是重写的父类的中的相同签名的方法,编译器会对此做出检查,若发现父类中不存在这个方法或是存在的方法签名不同,则会报错。

@Deprecated

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
	public @interface Deprecated {
}

从源码中可以知道,它会被文档化,能够保留到运行时,能够修饰构造方法、属性、局部变量、方法、包、参数、类型。这个注解的作用是告诉编译器被修饰的程序元素已被“废弃”,不再建议用户使用

@SuppressWarnings

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

它能够修饰的程序元素包括类型、属性、方法、参数、构造器、局部变量,只能存活在源码时,取值为String[]。它的作用是告诉编译器忽略指定的警告信息,它可以取的值如下所示:

元注解

  • @Target:用来限制注解的使用范围

  • @Retention:指定其所修饰的注解的保留策略

  • @Document:该注解是一个标记注解,用于指示一个注解将被文档化

  • @Inherited:该注解使父类的注解能被其子类继承

  • @Repeatable:该注解是Java8新增的注解,用于开发重复注解

  • 类型注解(Type Annotation):该注解是Java8新增的注解,可以用在任何用到类型的地方,做强类型检查

@Target

用来限制注解的使用范围,即指定被修饰的注解能用于哪些程序单元

取值范围定义在ElementType 枚举中

public enum ElementType {
 
    TYPE, // 类、接口、枚举类
 
    FIELD, // 成员变量(包括:枚举常量)
 
    METHOD, // 成员方法
 
    PARAMETER, // 方法参数
 
    CONSTRUCTOR, // 构造方法
 
    LOCAL_VARIABLE, // 局部变量
 
    ANNOTATION_TYPE, // 注解类
 
    PACKAGE, // 可用于修饰:包
 
    TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
 
    TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
 
}

@Retention & @RetentionTarget

用于指定被修饰的注解可以保留多长时间,即指定JVM策略在哪个时间点上删除当前注解。保留策略值有以下三个:

定义在RetentionPolicy枚举中。

public enum RetentionPolicy {
 
    SOURCE,    // 源文件保留
    CLASS,       // 编译期保留,默认值
    RUNTIME   // 运行期保留,可通过反射去获取注解信息
}

@Document

用于指定被修饰的注解可以被javadoc工具提取成文档。定义注解类时使用@Document注解进行修饰,则所有使用该注解修饰的程序元素的API文档中将会包含该注解说明。

@Inherited

指定注解具有继承性,如果某个注解使用@Inherited进行修饰,则该类使用该注解时,其子类将自动被修饰

@Repeatable

用于开发重复注解。在Java8之前,同一个程序元素前只能使用一个相同类型的注解,如果需要在同一个元素前使用多个相同类型的注解必须通过注解容器来实现。

public @interface Authority {
     String role();
}

public @interface Authorities {
    Authority[] value();
}

public class RepeatAnnotationUseOldVersion {

    @Authorities({@Authority(role="Admin"),@Authority(role="Manager")})
    public void doSomeThing(){
    }
}

从Java8开始,允许使用多个相同的类型注解来修饰同一个元素,前提是该类型的注解是可重复的,即在定义注解时要用 @Repeatable元注解进行修饰。

@Repeatable(Authorities.class)
public @interface Authority {
     String role();
}

public @interface Authorities {
    Authority[] value();
}

public class RepeatAnnotationUseNewVersion {
    @Authority(role="Admin")
    @Authority(role="Manager")
    public void doSomeThing(){ }
}

不同的地方是,创建重复注解Authority时,加上@Repeatable,指向存储注解Authorities,在使用时候,直接可以重复使用Authority注解。从上面例子看出,java 8里面做法更适合常规的思维,可读性强一点

@Native

@Native 注解修饰成员变量,则表示这个变量可以被本地代码引用,常常被代码生成工具使用。对于 @Native 注解不常使用,了解即可

类型注解

类型注解被用来支持在Java的程序中做强类型检查。配合插件式的check framework,可以在编译的时候检测出runtime error,以提高代码质量。这就是类型注解的作用了。

关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~

本文已收录于我的个人博客:https://www.seven97.top

公众号:seven97,欢迎关注~

标签:Authority,类型,编译器,优点,修饰,注解,public
From: https://www.cnblogs.com/seven97-top/p/18383491

相关文章

  • LaViT:Less-Attention Vision Transformer的特性与优点
    引言https://arxiv.org/pdf/2406.00427随着计算机视觉领域的发展,视觉Transformer(ViTs)逐渐成为一项重要技术。尽管ViTs在捕捉图像中的长距离依赖关系方面表现出色,但其沉重的计算负担和潜在的注意力饱和问题一直是实际应用的障碍。为解决这些问题,微软提出了Less-AttentionV......
  • 【Leetcode 2032 】 至少在两个数组中出现的值 —— 哈希表与按位运算符(最全的注解)
    给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。示例1:输入:nums1=[1,1,3,2],nums2=[2,3],nums3=[3]输出:[3,2]解释:至少在两个数组中出......
  • @Transitional注解失效场景
     @Transitional注解用于完成声明式事务操作,默认当发生RuntimeException时会对当前事务操作进行回滚,但其使用不当就会造成失效;场景一:抛出异常非RuntimeException@Transitionalpublicvoidinsert()throwsException{//insert...thrownewException();}解决......
  • 【Spring Boot进阶】掌握Spring Boot框架核心注解:从入门到精通(实战指南)
    文章目录SpringBoot注解大全:深入理解与实践引言第一部分:基础知识1.SpringBoot和Java注解简介2.SpringBoot项目搭建第二部分:核心注解详解3.@SpringBootApplication4.@Component,@Service,@Repository,@Controller,@RestController5.@Autowired6.@Bean7......
  • 【Spring进阶】掌握Spring MVC框架核心注解:从基础到实战应用(实战指南)
    文章目录SpringMVC常用注解详解及实践引言第一部分:SpringMVC基础回顾第1章:SpringMVC概述第2章:MVC模式与SpringMVC第3章:快速上手SpringMVC第二部分:核心控制器注解第4章:@Controller第5章:@RestController第6章:@RequestMapping第三部分:请求处理注解第7章:@RequestParam......
  • Spring系列之Spring Cache缓存注解的使用
    目录一、概述二、缓存注解1、@Cacheable缓存结果2、@CachePut更新缓存3、@CacheEvict 清除缓存4、@Caching组合缓存(不常用)5、@CacheConfig类级别缓存配置(不常用)6、@CacheResult设置缓存超时(不常用)三、使用方式1、@EnableCaching开启缓存2、在方法上添加注解@C......
  • dubbo[3]_注解配置
    本文介绍注解方式配置dubbo的例子。服务提供Provider1.定义接口Animal和实现类CatAnimal:publicinterfaceAnimal{/***描述:返回动物的叫声*/Stringsound();}Cat:packagecom.yt.provider;importcom.alibaba.dubbo.config.annotation.Ser......
  • springboot[2]_常用注解
    介绍一些常用注解。springBoot因为很少用到xml来配置bean文件,所以大部分都是用注解来创建和管理相关bean。@Component、@Service、@Repository和@Controller这几个注解效果都是差不多的,都是可以用来创建bean实例的。只是规定使用的方法不同而已。1.@Component自动被compo......
  • 求一命题,一注解,一翻译
    古有一妇,江海溺水。三男子过之:一拜,一遮衣,一立冢。 二世显为人,于世相逢,三男子差时遇:一识,一挚友,一百年。 前世知乎?今遇蔡氏娇娘,吾亦念百年缘也,日省己身,以时间为媒,与汝始于初见止于终老,生生世世,不悔不怨也,遂,焉知己非前世之偿也? —— 作者:张海清......
  • @Mapper,@Repository,@MapperScan注解对比
    1.@Repository@Repository是标注在Dao层接口上的,作用是将接口的一个实现类交给Spring管理。但是它需要配合@MapperScan进行使用,把@MapperScan("Mapper接口层路径")添加到启动类,系统会扫描持久层创建实现类并交给spring管理。2.@Mapper@Mapper也是使用在Dao层接口上的,使用它后就......