26.注解、动态代理

news2024/9/23 19:21:49

目录

一.注解

1.1 注解概述

1.2 注解的作用

1.3 自定义注解

1.3.1 什么是自定义注解

1.3.2 自定义注解格式

1.3.3 注意事项

1.3.4 代码示例

1.4 元注解

1.4.1 什么是元注解

1.4.2 种类

1.5 注解解析

1.5.1 什么是注解解析

1.5.2 相关接口

1.5.3 注意事项(重要)

1.5.4 解析注解的技巧

1.5.5 案例一

1.5.6 案例二

二.动态代理

2.1 什么是动态代理

2.2 步骤

2.3 动态代理的优点

2.4 代码示例


一.注解

1.1 注解概述

Java注解又称Java标注,是JDK5.0引入的一种注释机制。
Java语言中的类、构造器、成员变量、成员方法、参数都可以被注解标注。

1.2 注解的作用

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

1.3 自定义注解

1.3.1 什么是自定义注解

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

1.3.2 自定义注解格式

1.3.3 注意事项

①value是特殊属性,如果只有一个value属性的情况下,注解中的value名称可以省略不写。
②但是如果有多个属性,且多个属性没有默认值,那么value属性的名称是不能省络的。

1.3.4 代码示例

1.4 元注解

1.4.1 什么是元注解

注解注解的注解

1.4.2 种类

元注解有二个
@Target:约束自定义注解只能在哪些地方使用
@Target 可使用的值定义在ElementType枚举类中,常用值如下:
TYPE,类,接口
FIELD, 成员变量
METHOD, 成员方法
PARAMETE R, 方法参数
CONSTRUCTOR, 构造器
LOCAL_VARIABLE, 局部变量
@Retention:申明注解的生命周期
@Retention 可使用的值定义在RetentionPolicy枚举类中,常用值如下:
SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
CLASS:  注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)

1.5 注解解析

1.5.1 什么是注解解析

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

1.5.2 相关接口

Annotation: 注解 的顶级接口, 注解都 Annotation 类型的 对象(自定义注解默认实现Annotation)
AnnotatedElement:该接口定义了与注解解析相关的解析方法

1.5.3 注意事项(重要)

所有的类成分Class, Method , Field , Constructor 都实现了AnnotatedElement接口他们都拥有解析注解的能力。

1.5.4 解析注解的技巧

注解在哪个成分上,我们就先拿哪个成分对象。
比如注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解
比如注解作用在类上,则要该类的Class对象,再来拿上面的注解
比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解

1.5.5 案例一

注解代码:
被注解标注的代码:
解析代码:

1.5.6 案例二

模拟Junit框架
需求: 定义若干个方法,只要加了 MyTest 注解,就可以在启动时被触发执行
分析:① 定义若干个方法,只要有 @MyTest 注解的方法就能在启动时被触发执行,没有这个注解的方法不能执行
          ②定义一个自定义注解 MyTest ,只能注解方法,存活范围是一直都在。
注解代码:
测试代码:

二.动态代理

2.1 什么是动态代理

代理就是被代理者没有能力或者不愿意去完成某件事,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能进行代理的。

2.2 步骤

1.创建一个接口
2.创建一个实现类要实现接口(代理通常是基于接口实现的)
3.创建代理类
4.创建测试类进行测试

2.3 动态代理的优点

1. 非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。
2. 可以为被代理对象的所有方法做代理。
3. 可以在不改变方法源码的情况下,实现对方法功能的增强。(重要)
4. 不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。

2.4 代码示例

由于代码太多,这里只放代理类的代码
代理类:
public class MyProxy {
    //通过一个静态方法,为用户业务对象返回一个代理对象
    public static <T> T getProxy(T obj){
        /**
         * 第一个参数:为代理对象设置类加载器,类加载器会将代理类加载到内存中,代理对象会根据代理类创建
         * 第二个参数:设置代理对象需要继承的接口
         * 第三个参数:设置被代理对象要增强的功能
         */
        return (T)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy:用户业务类的类对象
             * @param method:用户业务类的对象方法
             * @param args:用户业务类的对象方法需要的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                long startTime = System.currentTimeMillis();
                Object o = method.invoke(obj,args);
                long enTime = System.currentTimeMillis();
                System.out.println("该方法花费时间位"+(enTime-startTime)/1000.0+"s");
                return o;
            }
        });
    }
}

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

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

相关文章

Java配置45-idea 与 maven 版本兼容问题

昨天帮助同事安装开发环境&#xff0c;下载项目之后 idea 报错Unable to import maven project: See logs for details这是 idea 与 maven 版本不兼容引起的。同事安装的 idea 为 2019 版本&#xff0c;maven 为 3.8.5 版本。查看 maven官网&#xff1a;https://maven.apache.o…

Java对象分配过程以及面试题

public static void main(String[] args) {Math math new Math();math.compute(); } 对于Math类来说&#xff0c;他还有一个类对象, 如下代码所示&#xff1a; Class<? extends Math> mathClass math.getClass(); 这个类对象是存储在哪里的呢&#xff1f;这个类对象…

将nodejs文件打包成exe, 并设置开机自启动(没有黑窗口)

nodejs打包成exe 使用node的pkg包 # 安装pkg npm install -g pkg # 使用pkg打包, 该命令会同时编译 linux, win, mac 版的exe pkg server.js # 只打包win版 pkg -t win server.js如果安装pkg后提示 pkg不是内部命令, 重新打开cmd窗口再试,如果还提示,则需要配置环境变量 查看…

力扣刷题记录——796. 旋转字符串、884. 两句话中的不常见单词、1046. 最后一块石头的重量

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——796. 旋转字符串、884. 两句话中的不常…

五金行业:强行业性的进销存系统具体看三项

很多五金的中小企业&#xff0c;都是从小作坊、个体户做大&#xff0c;普遍有着规模小&#xff0c;管理方式传统&#xff0c;行业内部管理水平偏低等缺陷。从年初忙到年尾&#xff0c;经营者也不清楚是赚是亏&#xff0c;竞争力不强&#xff0c;很多五金企业只要用上管理软件&a…

【HBase高级】1.重要工作机制(1)——读数据流程、数据存储流程

1. 重要工作机制 1.1 读数据流程 1.从zookeeper找到meta表的region的位置&#xff0c;然后读取meta表中的数据。而meta中又存储了用户表的region信息 ZK&#xff1a;/hbase/meta-region-server&#xff0c;该节点保存了meta表的region server数据 2.根据namespace、表名和row…

Elasticsearch:理解 query_string 和 simple_query_string 查询

针对很多的开发者来说&#xff0c;如果你不是很熟悉 DSL 查询&#xff0c;那么在有些情况下&#xff0c;query_string 及 simple_query_string 变得非常灵活及方便。在今天的文章中&#xff0c;我来比较一下这两种查询的方法。 准备数据 我们先使用 _bulk 命令创建如下的一个索…

Go语言入门学习(一)——变量,类型,运算符

Go语言入门学习&#xff08;一&#xff09;——变量&#xff0c;类型&#xff0c;运算符 最近看了蔡超老师与极客邦合作的Go语言学习教程&#xff0c;让我这个之前学java一知半解的我收获颇丰&#xff0c;所以想借此机会把自己的学习历程记录下来&#xff0c;以供后续的查阅 一…

【HoloLens 2 应用开发】自定义手部骨架可视化

推荐微信阅读&#xff1a;【HoloLens 2 应用开发】自定义手部骨架可视化 关闭默认可视化 首先关闭默认的手部可视化&#xff0c;详见上文。 添加预制件 首先&#xff0c;在场景中添加一个 sphere 的 GameObject 对象作为手部关节的预制件。 然后&#xff0c;在场景中添加一个…

CentOS7 网卡bondvlan bond

网卡bonding简介网卡绑定就是把多张物理网卡通过软件虚拟成一个虚拟的网卡&#xff0c;配置完毕后&#xff0c;所有的物理网卡的ip和mac将会变成相同的。多网卡同时工作可以提高网络速度&#xff0c;还可以实现网卡的负载均衡、冗余。bonding模式round-robin(mode0)轮转策略&am…

Docker - 3. 镜像常用命令 docker images、search、pull、rmi

目录 1. 帮助命令 2. 镜像命令 2.1 docker images [选项]&#xff1a;查看所有镜像、仓库、标签和大小 2.2 docker search [选项] 镜像名字&#xff1a;在 Docker Hub 中搜索镜像 2.3 docker pull 镜像名字[:tag]&#xff1a;下载镜像&#xff0c;tag为指定的版本 2.4 d…

MySQL索引特性

文章目录MySQL索引特性索引的概念认识磁盘磁盘的结构磁盘的随机访问&#xff08;Random Access&#xff09;与连续访问&#xff08;Sequential Access&#xff09;MySQL与磁盘交互的基本单位索引的理解观察主键索引现象推导主键索引结构的构建索引结构可以采用哪些数据结构聚簇…

PCI设备的访问方法_桥设备(type1)

PCI设备的访问方法_桥设备(type1) 文章目录PCI设备的访问方法_桥设备(type1)参考资料&#xff1a;一、 硬件结构二、 PCI设备类别及配置方法2.1设备类别2.2 配置设备时怎么选中它三、 配置示例3.1 示例&#xff1a;配置PCI Agent设备3.2 示例&#xff1a;配置PCI桥3.3 示例&…

ThinkPad R490电脑开机之后无限重启怎么重装系统?

ThinkPad R490电脑开机之后无限重启怎么重装系统&#xff1f;有用户使用ThinkPad R490电脑正常开机的情况下&#xff0c;出现了系统自动重启的情况&#xff0c;无法正常的使用电脑了。遇到这个情况怎么去重装一个新的电脑系统&#xff0c;恢复正常使用呢&#xff1f;来看看以下…

九种查找算法-红黑树

红黑树 2-3查找树能保证在插入元素之后能保持树的平衡状态&#xff0c;最坏情况下即所有的子节点都是2-node&#xff0c;树的高度为lgn&#xff0c;从而保证了最坏情况下的时间复杂度。但是2-3树实现起来比较复杂&#xff0c;于是就有了一种简单实现2-3树的数据结构&#xff0…

MySQL 数据库练习题记录02

文章目录前言一、数据库基础1.1 sql练习题1.2 sql语句执行顺序1.3 sql语句编写前言 本文主要记录B站视频视频链接的内容&#xff0c;做到知识梳理和总结的作用&#xff0c;项目git地址。 一、数据库基础 1.1 sql练习题 user表数据: idusername1张三2李四3王五4小刘 user_r…

代码随想录算法训练营第32天 回溯算法 java :491.递增子序列 46.全排列47.全排列 II

文章目录LeetCode 491.递增子序列题目详解注意难点示意图LeetCode 46.全排列题目讲解难点LeetCode47.全排列 II题目讲解示图难点总结LeetCode 491.递增子序列 题目详解 注意难点 在题目中有涉及到 子集序列中至少有两个元素 可以用来进行判断 在单层遍历之前需要声明一个数组…

统计学必备基础知识

一&#xff0c;统计学分为两种&#xff1a;1.描述性统计 2.推断性统计 1.统计数据的类型 (1).计量尺度分为3类&#xff1a;分类数据&#xff0c;顺序数据&#xff0c;数值型数据 分类数据&#xff1a;文字表达数据 顺序数据&#xff1a;非数据型数据&#xff0c;顺序数据…

【swagger】spring security中 swagger2,swagger3和knife4j集成的区别 真的弄懂了吗?

文章目录导包正确方式swagger2在security中放行swagger3在security中放行knife4j放行失败原因分析&#xff1a;swagger访问失败原因分析&#xff1a;作为一个强迫症重度的程序猿 不想多导一个jar包 本文创作背景是鉴于网上大多数是旧版本swagger2的教程&#xff0c;且没有针对2…

【数据结构初阶】第五篇——栈和队列

栈 栈的概念及结构 栈的实现 栈的初始化 销毁栈 入栈 出栈 获取栈顶元素 检测栈是否为空 获取栈中有效元素个数 队列 队列的概念和结构 队列的实现 队列的初始化 销毁队列 入队 出队 获取对头元素 获取队尾元素 判断队列是否为空 获取队列中元素个数 栈 栈…