注解,自定义注解和元注解

1.注解

1.1.注解概述、作用

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

  • 注解:说明程序的。给计算机看的
  • 注释:用文字描述程序的。给程序员看的

对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来定。
例如:JUnit框架中,标记了注解@Test的方法就可以被当成测试方法执行,而没有标记的就不能当成测试方法执行

作用分类:

        ①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】

        ②代码分析:通过代码里标识的注解对代码进行分析【使用反射】

        ③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

1.2.内置注解

Java中有三种内置注解,这些注解用来为编译器提供指令,它们是:

@Deprecated

​ 这个元素是用来标记过时的元素,编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量

​ 可以用来标记类,方法,属性;

@Override

​ 用来修饰对父类进行重写的方法。如果一个并非重写父类的方法使用这个注解,编译器将提示错误。

​ 实际上在子类中重写父类或接口的方法,@Overide并不是必须的。但是还是建议使用这个注解,在某些情况下,假设你修改了父类的方法的名字,那么之前重写的子类方法将不再属于重写,如果没有@Overide,你将不会察觉到这个子类的方法。有了这个注解修饰,编译器则会提示你这些信息

@SuppressWarnings

​ 用来抑制编译器生成警告信息

​ 可以修饰的元素为类,方法,方法参数,属性,局部变量

​ 当我们一个方法调用了弃用的方法或者进行不安全的类型转换,编译器会生成警告。我们可以为这个方法增加@SuppressWarnings注解,来抑制编译器生成警告。

​ 注意:使用@SuppressWarnings注解,采用就近原则,比如一个方法出现警告,我们尽量使用@SuppressWarnings注解这个方法,而不是注解方法所在的类。虽然两个都能抑制编译器生成警告,但是范围越小越好,因为范围大了,不利于我们发现该类下其他方法的警告信息

//告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
@SuppressWarnings(“unchecked”)

//如果编译器出现这样的警告信息:The serializable class WmailCalendar does not declare a     //static final serialVersionUID field of type long,使用这个注释将警告信息去掉。
@SuppressWarnings(“serial”)

//如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。
@SuppressWarnings(“deprecation”)

//rawtypes是说传参时也要传递带泛型的参数 
@SuppressWarnings(“rawtypes”) 

//抑制所有类型的警告:
@SuppressWarnings(“all”)

2.元注解

元注解是指用于注解其他注解的注解。在Java中,元注解是一种特殊的注解,用于对其他注解进行修饰和控制。元注解可以用于定义自定义注解的行为、作用范围、生命周期等属性。

本质:注解本质上就是一个接口,该接口默认继承Annotation接口

            * public interface MyAnno extends java.lang.annotation.Annotation {}

元注解有两个:

  •  @Target: 约束自定义注解只能在哪些地方使用,
  •  @Retention:申明注解的生命周期

@Target中可使用的值定义在ElementType枚举类中,常用值如下:

  •  TYPE,类,接口,枚举
  •  FIELD, 成员变量
  • METHOD, 成员方法
  • PARAMETER, 方法参数
  • CONSTRUCTOR, 构造器
  • LOCAL_VARIABLE, 局部变量
  • ANNOTATION_TYPE:注解类型。
  • PACKAGE:包。

@Retention中可使用的值定义在RetentionPolicy枚举类中,常用值如下:

  • SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
  •  CLASS:  注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
  •  RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)

@Documented:指定注解是否包含在Java文档中。

@Inherited:指定注解是否可以被继承。如果一个注解被@Inherited修饰,那么它将被子类继承。

@Repeatable:指定注解是否可重复应用于同一目标元素。该元注解在Java 8中引入

元注解的作用是为其他注解提供更多的控制和限制。通过使用元注解,开发人员可以定义自己的注解,并指定它们的作用范围、生命周期和其他属性,从而实现更加灵活和可定制的注解功能。

3.自定义注解

自定义注解就是自己做一个注解来使用

  • value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写!!
  • 但是如果有多个属性,  且多个属性没有默认值,那么value名称是不能省略的。

4.注解解析

注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容

要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象

与注解解析相关的接口:

  • Annotation: 注解的顶级接口,注解都是Annotation类型的对象
  • AnnotatedElement:该接口定义了与注解解析相关的解析方法

解析注解的技巧:
注解在哪个成分上,我们就先拿哪个成分对象。

  •  比如注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解
  •  比如注解作用在类上,则要该类的Class对象,再来拿上面的注解
  •  比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解

5.案例

模拟Junit框架:定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行

public class Calculator {
    //加法
    @Check
    public void add(){
        System.out.println("1 + 0 =" + (1 + 0));
    }
    //减法
    @Check
    public void sub(){
        System.out.println("1 - 0 =" + (1 - 0));
    }
    //乘法
    @Check
    public void mul(){
        System.out.println("1 * 0 =" + (1 * 0));
    }
    //除法
    @Check
    public void div(){
        System.out.println("1 / 0 =" + (1 / 0));
    }


    public void show(){
        System.out.println("永无bug...");
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Check {
}
public class TestCheck {
    /**
     * 简单的测试框架
     *
     * 当主方法执行后,会自动自行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中
     */
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, IOException {
        //Class cls = Class.forName("annotation.Calculator");
        Calculator c = new Calculator();
        Class<? extends Calculator> cls = c.getClass();
        //获取所有方法
        int number=0;//出现异常的次数
        BufferedWriter br=new BufferedWriter(new FileWriter("bug.txt"));
       Method[] methods = cls.getMethods();
        for (Method m :
                methods) {
            //判断方法上是否有check注释
            if(m.isAnnotationPresent(Check.class)){
                try {
                    m.invoke(c);
                } catch (Exception e) {
                    //捕获异常
                    //记录到文件
number++;
br.write(m.getName()+"方法出异常了");
br.newLine();
br.write("异常名称"+e.getCause().getClass().getSimpleName());
br.newLine();
br.write("异常原因"+e.getCause().getMessage());
                }
            }
        }
        br.write("本次一共出现"+number+"次异常");
        br.flush();
        br.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/519533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录12-3 p125 Limit Inventory Slots源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Inventory.cs using Newtonsoft.Json.Linq; using System.Collections; us…

Django--admin 后台管理站点

Django最大的优点之一&#xff0c;就是体贴的提供了一个基于项目model创建的一个后台管理站点admin。这个界面只给站点管理员使用&#xff0c;并不对大众开放。虽然admin的界面可能不是那么美观&#xff0c;功能不是那么强大&#xff0c;内容不一定符合你的要求&#xff0c;但是…

正则表达式(2)

文章目录 专栏导读1、贪婪与非贪婪2、转义匹配 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生、初级数据分析工程师精…

完美运营版商城源码 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城(带安装教程)

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码下载…

Chatgpt掘金之旅—有爱AI商业实战篇|专业博客|(六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业博客领域有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技…

SketchUp Pro 2024 for mac 草图大师 专业的3D建模软件

SketchUp Pro 2024 for Mac是一款功能强大的三维建模软件&#xff0c;适用于Mac电脑。其简洁易用的界面和强大的工具集使得用户可以轻松创建复杂的3D模型。 软件下载&#xff1a;SketchUp Pro 2024 for mac v24.0.483 激活版下载 SketchUp Pro 2024 for Mac支持导入和导出多种文…

[C++初阶]初识C++(二)

建议先看完上篇&#xff1a;[C初阶]初识C(一)—————命名空间和缺省函数-CSDN博客 本篇部分代码和文案来源&#xff1a;百度文库&#xff0c;知乎&#xff0c;比特就业课 1.函数重载 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真…

7种链游媒体宣发工具助力游戏营销-华媒舍

一. 什么是链游媒体 链游媒体是指以区块链技术为基础&#xff0c;实现游戏与媒体资源之间的连接和交互的媒体形态。通过区块链技术&#xff0c;链游媒体能够确保游戏内容和媒体信息的透明性和不可篡改性&#xff0c;提供更加公正、透明的游戏环境。 二. 链游媒体宣发工具的重要…

Linux安装nginx保姆级教程

文章目录 前言一、nginx安装&#xff08;保姆级教程&#xff09;1.安装nginx依赖2.安装wget3.创建nginx安装目录4.下载nginx5.查看下载好的nginx6.解压缩7.查看当前目录下的文件→进入nginx-1.8.0目录→查看当前目录下的文件8.安装nginx9.查看nginx安装目录并启动nginx10.网络请…

Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.4 库存超卖问题及其解决4.3.4.1 问题分析4.3.4.2 问题解决 4.3.5 一人一单需求4.3.5.1 需求分析4.3.5.2 代码实现4.3.5.3 并发问题4.3.5.4 悲观锁解决并发问题4.3.5.5 集群环境下的并发问题 4.3.…

状态优先级

文章目录 状态优先级1. 进程状态1.1 进程状态查看1.2 僵尸进程1.3 孤儿进程 2.进程优先级2.1 基本概念2.2 查看系统进程2.3 PRI and NI2.4 PRI vs NI 3. 查看进程优先级的命令3.1 top命令更改nice3.2 其他概念 状态优先级 1. 进程状态 看看Linux内核源代码怎么说 为了弄明白…

爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫&#xff1a;红网网站&#xff0c; 获取指定关键词与指定时间范围内的新闻&#xff0c;并存储到CSV文件 V2.0&#xff08;控制台版&#xff09; 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 对比V1.0升级的…

设计模式总结-原型设计模式

原型设计模式 模式动机模式定义模式结构模式分析深拷贝和浅拷贝原型模式实例与解析实例一&#xff1a;邮件复制&#xff08;浅克隆&#xff09;实例二&#xff1a;邮件复制&#xff08;深克隆&#xff09; 模式动机 在面向对象系统中&#xff0c;使用原型模式来复制一个对象自…

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法&#xff0c;本以为基于深度学习的方法会使用对比损失之类的函数进行训练&#xff0c;但是Arcface算法基于softmax进行了创新&#xff0c;本文未深究其详细的loss公式原理&#xff0c;在大致明白其方向下&#xff0c;运行了代码&#xff0c;…

2024.4.2-[作业记录]-day07-CSS 盒子模型(显示模式、盒子模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.2 学习笔记CSS标签元素显示模式1 块元素2 行内元素3 行内块元素4…

计算机组成结构—存储器概述

目录 一、存储器的分类 1.按存储介质分类 半导体存储器 磁性材料存储器 光盘存储器 2.按存取方式分类 随机存储器&#xff08;Random Access Memory&#xff0c; RAM&#xff09; 只读存储器&#xff08;Read Only Memory&#xff0c; ROM&#xff09; 串行访问存储器…

如何在iPhone上恢复永久删除的照片?

2007 年&#xff0c;Apple Inc. 推出了这款震撼人心的智能手机&#xff0c;后来被称为 iPhone。您会惊讶地发现&#xff0c;迄今为止&#xff0c;Apple Inc. 已售罄 7 亿台 iPhone 设备。根据 2023 年 8 月的一项调查数据&#xff0c;95% 的智能手机利润都落入了苹果公司的口袋…

下载页面上的视频

引言&#xff1a;有些页面上的视频可以直接右键另存为或者F12检索元素找到视频地址打开后保存&#xff0c;但有些视频页面是转码后的视频&#xff0c;不能直接另存为视频格式&#xff0c;可以参考下本方法 以该页面视频为例&#xff1a;加载中...点击查看详情https://wx.vzan.c…

#SOP#-如何使用AI辅助论文创作

#SOP#-如何使用AI辅助论文创作 ——2024.4.6 “在使用工具的时候&#xff0c;要做工具的主人” 最终交付物&#xff1a; 一份可执行的AI辅助创作论文的指导手册 交付物质量要求&#xff1a; 不为任何AI大模型付费&#xff01;不为任何降重网站付费&#xff01;通过知网检查论…

苍穹外卖08(地址簿功能,用户下单功能,订单支付全过程,内网穿透Cpolar)

目录 一、导入地址簿功能代码 1. 需求分析和设计 1 产品原型 2 接口设计 2. 代码导入 3. 功能测试 二、用户下单 1. 需求分析和设计 1 产品原型 2 接口设计 3 表设计 2. 代码开发 1 DTO设计 2 VO设计 3 开发代码 3. 功能测试 三、订单支付 1 微信支付介绍 1 …