Java注解(Annotation)

news2024/12/23 0:47:29

一、什么是注解

个人理解,注解就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,从而做相对应的处理

注解跟注释很像,区别是注释是给人看的;而注解是给程序看的,它可以被编译器读取

二、注解的作用

注解大多时候与反射或者 AOP 切面结合使用,它的作用有很多,比如标记和检查,最重要的一点就是简化代码,降低耦合性,提高执行效率。比如可以通过自定义注解 + AOP 切面结合,解决写接口重复提交的问题。

三、注解的定义语法

// 声明 NoRepeatSubmit 注解
@Target(ElementType.METHOD) // 元注解
@Retention(RetentionPolicy.RUNTIME) // 元注解
public @interface MyAnnotation {

 /**
     * 锁定时间,默认单位(秒)
     */
 long lockTime() default 3L;

}

四、注解类型

注解可以分为三类,基本注解、元注解和自定义注解

其中基本注解例如@Override 用于表明检查方法是否被重写;@SuppressWarning 表明编译器忽略注解中声明的警告。

元注解常用的@ Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME);@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)。

 自定义注解则可以根据第三部分语法自己定义需要的注解。

五、代码演示

 首先声明一个注解,Init用来表示这个方法是初始化方法。

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Init {

}

再写一个Demo类,写几个方法并用Init注解,表明这些类会在类初始化时候使用。 Demo类中有两个构造方法,有两个被@Init修饰的方法。

package Annotation;

public class Demo {
    int i;
    int l;

    public Demo(){
        System.out.println("无参构造方法");
    }

    public Demo(int i,int l ){
        this.i = i;
        this.l = l;
        System.out.println("有参构造方法"+this.i+this.l);
    }

    @Init
    public void print(){
        System.out.println("无参初始化方法");
    }
    @Init
    public void printInt(int i){
        System.out.println("有参初始化方法"+i);
    }
}

定义一个测试类用来通过反射来获取被@Init修饰的方法,并操作方法

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {

        Class<? extends Demo> aClass = Demo.class;

        //有参建立实例
        Demo demo = aClass.getConstructor(int.class, int.class).newInstance(6, 7);
        //无参数建立实例
        //1、
        aClass.newInstance();
        //2、
        aClass.getConstructor(null).newInstance(null);

        System.out.println("-----------------------------");
        //不含构造方法父类继承方法
        Method[] declaredMethods = aClass.getDeclaredMethods();

        for (Method declaredMethod : declaredMethods) {

            //判断方法是否存在Init
            boolean annotationPresent = declaredMethod.isAnnotationPresent(Init.class);
            //如果存在则调用
            if(annotationPresent){
                if(declaredMethod.getName().equals("printInt")){
                    declaredMethod.invoke(aClass.getConstructor(null).newInstance(null),5);
                }
                else {
                    declaredMethod.invoke(aClass.getConstructor(null).newInstance(null));
                }

            }

        }
    }
}

运行结果:

有参构造方法67
无参构造方法
无参构造方法
-----------------------------
无参构造方法
无参初始化方法
无参构造方法
有参初始化方法5

这里有一个小的知识点,newInstance()创建实例的两种方法

Class.newInstance()
Constructor(Classes).newInstance(args)

以下对两种调用方式给以比较说明:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

Class.newInstance() 抛出所有由被调用构造函数抛出的异常。

Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ERP软件定价策略与模型设计

ERP软件定价(价格)的高低是ERP厂商整体竞争力强弱的一个重要指针&#xff0c;也是影响客户购买行为的重要因素。客户购买某一ERP软件&#xff0c;总是面临不同的ERP厂商﹑不同渠道的多种选择&#xff0c;ERP软件价格往往成了除软件功能﹑售后服务态度、实施水平等因素外&#x…

web前端-Ajax基础学习

web前端-Ajax基础学习1. Ajax基础描述1.1 URL地址的概念1.2 客户端和服务器的通信过程1.3 Ajax1.3.1 $.get()函数1.3.2 $.post()1.3.3 $.ajax()1.4 接口1.4.1 GET、POST方式请求的过程1.4.2 接口文档2. form表单与模版引擎2.1 表单的基本介绍2.2 form表单同步提交的缺点2.3 通过…

stm32 笔记 外部中断以及HAL库应用

外部中断 由外部设备发起的中断请求&#xff0c;会使得设备暂停当前的主程序&#xff0c;保存标志位并把当前指令压入堆栈&#xff0c;转而去执行中断的子程序。执行完毕后再弹出执行堆栈&#xff0c;恢复标志位&#xff0c;继续执行主程序。 STM32 的外部中断线 STM32的每个…

嵌入式 C语言/C++ 常见笔试、面试题 难疑点汇总(经典100道)

#pragma comment。将一个注释记录放置到对象文件或可执行文件中。 #pragma pack。用来改变编译器的字节对齐方式。 #pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数&#xff0c;函数将放置在默认代码段.text中 #pragma once。保证所在文件只…

Pytest接口测试框架实战项目搭建(三)

一、前言 前面相当于已经讲完整体框架搭建了&#xff0c;本篇主要讲述在实际业务系统的接口请求中&#xff0c;如何运用好该接口自动化测试框架。 二、步骤演示 1、在conf/api_path.py新增需要测试的接口&#xff0c;标黄底色为新加 存放测试接口仅这一个文件就行&#xff0c…

吉时利2604B系列数字源表,双通道,3A直流/10A脉冲

作为2600B系列源表SMU系列产品的一部分&#xff0c;2602B源表SMU是全新改良版双通道SMU&#xff0c;具有紧密集成的4象限设计&#xff0c;能同步源和测量电压/电流以提高研发到自动生产测试等应用的生产率。除保留了2602A的全部产品特点外&#xff0c;2602B还具有6位半分辨率、…

Android 面试题收集:Handler+Binder+Activity+时间分发机制+View绘制流程+……等

一、Handler相关知识 一个线程只有一个Looper&#xff0c;一个Messagequeue&#xff0c;可以创建多个handler。 1、Handler与Looper的关联是怎样的? 实例化 Handler 的时候 Handler 会去检查当前线程的 Looper 是否存在&#xff0c;如果不存在则会报异常&#xff0c;也就是…

关于TreeView的简单使用(Qt6.4.1)

前言 TreeView是在Qt6.3中加入的&#xff0c;弥补了Qt中无官方树图。笔者上手尝试了下&#xff0c;虽然有点麻烦&#xff0c;但官方也做了不少简化。 本次教程&#xff0c;笔者创建一个简单的示例&#xff0c;以帮助读者使用TreeView。 一、创建模型类 当前模型需要使用C定义…

人工智能概况笔记

文章目录一、人的智能与人工智能二、人工智能的发展历程三、人工智能的主要应用四、人工智能的伦理思考五、神经网络与深度学习六、国内外人工智能动向一、人的智能与人工智能 智能&#xff1a;基于推理的学习、理解和做出判断或意见的能力 人的智能&#xff08;Human Intell…

【数据结构-树】哈夫曼树及其应用

文章目录1 哈夫曼树的构造2 哈夫曼树的应用——哈夫曼编码3 相关例子1 哈夫曼树的构造 将 n 个结点作为 n 棵仅含一个节点的二叉树&#xff0c;构成森林 F在 F 中选取两棵权值最小的二叉树&#xff0c;作为新结点的左右子树&#xff0c;并将新结点的权值置为左、右子树的根结点…

Nodejs -- 前后端身份认证概念及在Express中使用认证(Session,Cookie,JWT)

文章目录前后端的身份认证1 Web开发模式1.1 服务器端渲染的Web开发模式1.2 前后端分离的Web开发模式1.3 如何选择Web开发模式2 身份认证2.1 什么是身份认证2.2 为什么需要身份认证2.3 不同开发模式下的身份认证3 Session认证机制3.1 HTTP协议的无状态性3.2 如何突破HTTP无状态的…

【STL】set集合

构造函数 std::set<std::string> myset;这条指令将会创建一个空的set容器 该容器会默认采用std::less< T >的排序规则对成员进行排序。 这种排序方法适用于内置的数据类型&#xff0c;比如整型、浮点型、字符串等等。 std::set<std::string> myset{"j…

Linux 之 Ubuntu 上 Vim 的安装、配置、常用命令的简单整理

Linux 之 Ubuntu 上 vim 的安装、配置、常用命令的简单整理 目录 Linux 之 Ubuntu 上 vim 的安装、配置、常用命令的简单整理 一、简单介绍 二、Vim 的安装 三、vim 的 32 种工作模式 四、vim 的一些基础配置&#xff0c;及其说明 五、普通模式下的常用操作命令 六、插入…

域自适应——Bidirectional Learning for Domain Adaptation of Semantic Segmentation

论文题目&#xff1a;Bidirectional Learning for Domain Adaptation of Semantic Segmentation 本文的域位移是针对虚拟数据和真实数据之间的。 本文的贡献是&#xff1a; 提出了一种语义分割的双向学习系统 &#xff0c;其是一个学习分割适应模型和图像翻译模型的闭环学习系…

如何安装使用Jupyter Notebook?

大家好鸭&#xff01;我是小熊猫~ 今天来给大家介绍一下关于Jupyter Notebook的用法 关于它的组成部分就先不在这里详细解说啦~ 毕竟我可太懂你们啦~ 文章太长就会吃灰的~ 源码、资料电子书免费获取可点击这里 一、什么是Jupyter Notebook&#xff1f; 1. 简介 Jupyter Not…

vue3 弹窗开发之三,完善版

首先我们看一看整体的效果 点击图一的缩略图&#xff0c;查看大图&#xff08;如图二&#xff09;。同时弹窗内容底下有当前所有图片的缩略图展示&#xff0c;同时通过一个橙色的边框定位当前缩略图的位置。切换左右箭头滚动下一站或者上一张&#xff0c;同时底下缩略图同步有个…

mybatis的xml中<trim>标签的用法

文章目录1. 前言2. 先说结论3. 验证1. 情况一2. 情况二3. 情况三4. 情况四5. 验证prefixOverrides去掉的是trim内原sql内容1. 前言 在工作中离不开跟数据库打交道&#xff0c;目前流行的固然是mybatis&#xff0c;在xml中写sql的时候&#xff0c;可能会出现下面情况&#xff1a…

线性表的顺序实现【C语言版的真代码】

顺序表线性表顺序表顺序表的概念及其结构顺序表基本操作顺序表的初始化顺序表的插入顺序表的删除顺序表的查找线性表 线性表&#xff1a;一个线性表是含n个数据元素的有限序列。 它的逻辑结构要求是线性的&#xff0c;但其存储结构并没有做要求&#xff0c;即逻辑结构类似于如…

非DBA人员从零到一,MySQL InnoDB数据库调优之路(四)-数据备份与迁移

上一篇【非DBA人员从零到一&#xff0c;MySQL InnoDB数据库调优之路(三)-分区表与分库分表】 我认为分表在数据库的调优中是一种加法&#xff0c;通过拆分单表数据到多个表中&#xff0c;减少单表的压力&#xff0c;从而达到调优的效果&#xff0c;那么这一篇博文会通过对数据…

Spring Security权限管理原理

1.简介 授权是更具系统提前设置好的规则&#xff0c;给用户分配可以访问某一资源的权限&#xff0c;用户根据自己所具有的权限&#xff0c;去执行相应的操作&#xff0c;spring security提供的权限管理功能主要有两种&#xff1a; 基于过滤器的权限管理功能&#xff08;Filte…