当前位置: 首页 > news >正文

java代理简单理解

一、什么是代理

举例说明:当我想买一台电脑,国内太贵了。委托好友A在国外帮忙买。

这个情节中我要实现的动作和好友实现的动作一样,都是买电脑。好友帮我完成了这个动作,这就是代理。

类A和类B都实现一个interface接口C,C规定了A和B要完成的动作。借助B类实现A类完成接口中的动作。

1.使用代理的场景?

(1)功能增强:B完成接口中的动作之余还做了别的事情

(2)控制访问:B不让A访问到目标类,只有通过B这个媒介,A才能访问

二、静态代理

静态代理就是:自己写类实现代理。

思路:一个接口C,一个代理类B,一个被代理类A。两个类都实现接口C,在B实现接口中的方法时调用A对象方法。

接口C:

public interface Singer {void singing();int dance();
}

被代理类A

public class Cai implements Singer {@Overridepublic void singing() {System.out.println("cai 唱歌");}@Overridepublic int dance() {System.out.println("tiaowu");return 0;}
}

 代理类A

public class Caidaili implements  Singer{private Singer cai = new Cai();@Overridepublic void singing() {System.out.println("先收钱");cai.singing();}@Overridepublic int dance() {System.out.println("先收钱");cai.dance();return 0;}
}

测试

public class Main {public static void main(String[] args) {Singer singer = new Caidaili();singer.singing();singer.dance();}
}

 静态代理的局限性:如果被代理类太多了,每个被代理类都要有一个代理。这样写的代理类就太多了。因此引入动态代理,动态决定被代理类。

三、动态代理

动态代理就是不需要自己写代理类了,通过反射或者继承实现。动态代理有两种模式:

(1)jdk动态代理

通过反射类实现代理

核心代码:

Proxy.newProxyInstance(被代理的类的类加载器,被代理类实现的接口,实现InvocationHandler的类对象)

返回:代理类对象

参数列表中:InvocationHandler接口(函数式接口)重写了invoke方法,重写代码中的核心:

被代理对象.方法()method.invoke(接口对象,参数)                  //表示调用这个接口中的方法

实例:

接口

public interface Singer {void dance();int singing();}

被代理类

public class Cai implements Singer {@Overridepublic void dance() {System.out.println("Cai 在跳舞");}@Overridepublic int singing() {System.out.println("Cai 在唱歌");return 0;}
}

jdk动态代理实现

public class Test1 {public static void main(String[] args) {Cai cai =new Cai();
//        Ruler ruler = new Ruler(cai);//构建了 以原被代理类为基准的代理类的一个对象// o 已经等同于 Student s = new Student(); 这个s了Object o = Proxy.newProxyInstance(Cai.class.getClassLoader(), new Class[]{Singer.class}, (proxy, method, args1) -> {System.out.println(proxy.getClass().toString());System.out.println("先收钱");Object returnVal = method.invoke(cai, args1);System.out.println("asdfasdf");return returnVal;});System.err.println(o.getClass().toString());if(o instanceof Singer){Singer singer =  (Singer)o;singer.dance();singer.singing();singer.toString();}}
}

(2)cglib动态代理

不写接口,通过继承关系重写方法实现代理

示例:

被代理类:

public class Singer {public void dance(){System.out.println("tiaowu");}public int singing(){System.out.println("changge");return 100;}
}

代理类:

public class SingerSub extends Singer {@Overridepublic void dance() {System.out.println("shouqian");super.dance();}@Overridepublic int singing() {System.out.println("shouqian");return super.singing();}
}

测试:

public class Main {public static void main(String[] args) {Singer singer = new SingerSub();singer.singing();singer.dance();}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 评估测试用例有效性 5个方面
  • 数学建模中常用的数据处理方法
  • c++:内存管理
  • Linux下使用arping检测IP地址是否冲突
  • 智慧园区管理系统建设方案(Word完整原件)
  • 双栈实现一个队列
  • 新手小白的pytorch学习第一弹-------张量
  • 生成日志系统和监控
  • 算法·高精度
  • C++的介绍与认识
  • 用JavaScript将 NCR(Numeric Character Reference)标记转换为对应字符的方法
  • 对称加密和非对称加密解析
  • 关于力扣150题目——逆波兰表达式求值Java实现的三种解法
  • 如何写好品牌宣传稿提升品牌曝光?看这篇文章就够了
  • Java虚拟机(JVM):深入理解与性能调优
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 30秒的PHP代码片段(1)数组 - Array
  • ES6系统学习----从Apollo Client看解构赋值
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • IDEA常用插件整理
  • JS函数式编程 数组部分风格 ES6版
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • PHP 的 SAPI 是个什么东西
  • Sass Day-01
  • 初识 webpack
  • 工程优化暨babel升级小记
  • 前端性能优化——回流与重绘
  • 数据可视化之 Sankey 桑基图的实现
  • 听说你叫Java(二)–Servlet请求
  • 携程小程序初体验
  • 异常机制详解
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #100天计划# 2013年9月29日
  • #LLM入门|Prompt#3.3_存储_Memory
  • #mysql 8.0 踩坑日记
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (c语言)strcpy函数用法
  • (javascript)再说document.body.scrollTop的使用问题
  • (Java入门)学生管理系统
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十三)Maven插件解析运行机制
  • (一)插入排序
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)C#调用WebService 基础
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET8使用VS2022打包Docker镜像
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?