| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java反射与动态代理(JDK与CGLIB) -> 正文阅读 |
|
[Java知识库]Java反射与动态代理(JDK与CGLIB) |
一、反射概念:在运行状态中,对于任意的一个类,都能够知道这个类的所有字段和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法 实现方法:JVM在第一次加载某个类时会生成一个Class对象,里面记录了这个类的信息 链接:类加载机制(留坑) 二、动态代理动态代理的作用:在不改变原代码的基础上增加新的功能,如日志、权限检验等 反射在动态代理中的应用:由于知道原类的字段、方法等信息,才可以通过代理类执行被代理类的方法 动态代理的实现有两种 1、JDK代理实现方法:通过创建一个代理类,这个代理类继承于一个Proxy类,Proxy类中有一个InvocationHandler接口,这个接口持有被代理对象和一个invoke()方法。创建好代理类对象后,对该对象调用的方法都会交由invoke方法处理。invoke方法接受3个参数:代理对象、方法、参数列表。重写invoke方法便可以在原方法的基础上添加其他逻辑 一个JDK代理的简单实现:
输出结果:
缺陷:只能代理接口方法,因为JDK代理需要继承一个Proxy类,又由于Java的单继承机制,导致代理类无法继承父类的函数,只能实现接口 2、CGLIB代理原理与JDK代理类似,区别在于CGLIB代理创建的代理类直接继承于被代理类,所以可以实现被代理类的方法而非仅仅接口方法 一个简单的CGLIB代理实现:
由于CGLIB并非JDK自带,所以需要通过Maven引入一个依赖
输出结果:
3、JDK代理与CGLIB代理对比1、JDK代理只能实现接口方法,而CGLIB代理既可以实现接口方法也可以实现类中自带的方法 2、性能上,在JDK1.8,CGLIB3.1.1的环境上,每次创建一个代理类并执行同样的方法 当执行10000次,JDK代理用时85ms,而CGLIB代理用时190ms,明显JDK代理性能更佳; 当执行1000000(一百万)次时,两种代理耗时几乎相等; 当执行10000000次时,CGLIB代理已经优于JDK代理。 所以在执行次数少时,JDK代理性能更好;反之CGLIB代理性能更好(但是重复执行多于1000000次的任务几乎没有吧...) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:16:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |