Java动态代理
时间:2019-04-19
本文章向大家介绍Java动态代理,主要包括Java动态代理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Java动态代理
什么是动态代理?
1、A接口有C方法,类B实现A接口,原本应该是执行B类中的C方法,可现在不这样做。
2、现在声明产生B类的代理类‘B’,由它来冒充B类的“兄弟”并“实现”A接口。
3、对外界来说‘B’应该也有C方法,可当真正的调用它时,它会执行与它关联InvocationHandler的invoke()方法,在这个方法里面你可以做很多事情。
动态代理:
代理模式是常用的java设计模式,它的特征是:
》代理类与委托类有同样的接口
》代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及时候处理消息等
》代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联。
》代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
JDK动态代理中包含一个类和一个接口: InvocationHandler接口: public interface InvactionHandler{ public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; } 参数说明: Object proxy:指被代理的对象 Method method:要调用的方法 Object[] args:方法调用时所需要的参数
Proxy类: Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供如下操作的方法: public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException 参数说明: ClassLoader loader:类加载器 Class<?>[] interfaces:得到全部的接口 InvocationHandler h:得到InvocationHandler接口的子类实例
实例:
public interface Dinner { public void haveDinner(); } //被代理类 public class MyDinner implements Dinner{ @Override public void haveDinner() { System.out.println("妈妈做饭真好吃"); } } //代理类 public class MyDinnerProxy implements InvocationHandler { private Object obj; //绑定被代理类对象,返回代理类对象 public Object bind(Object obj){ this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); } private void before(){ System.out.println("吃饭前洗手"); } private void after(){ System.out.println("吃饭后刷碗"); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { after(); Object retrunVal = method.invoke(obj,args); before(); return retrunVal; } } //测试类 public static void main(String[] args){ Dinner hd = new MyDinner();//可以调用被代理类重写的方法 MyDinnerProxy mdp = new MyDinnerProxy();创建一个这个类的对象 //返回一个代理类对象,向上转型,调用重写的方法,也就是invoke()方法 hd = (Dinner) mdp.bind(hd); hd.haveDinner(); }
- “奇幻熊”(APT28)组织最新攻击
- GDB调试CVE-2018-5711 PHP-GD拒绝服务漏洞
- 高效与争议并存:大规模自动化渗透工具AutoSploit
- Android应用测试速查表
- ADB配置提权漏洞(CVE-2017-13212)原理与利用分析
- Fuzz自动化Bypass软WAF姿势
- Web黑盒渗透思路之猜想
- ZZCMS v8.2 最新版SQL注入漏洞
- 一款轻量级Web漏洞教学演示系统(DSVW)
- 使用Burpsuite代理和pypcap抓包进行抢红包的尝试
- 基于WAVSEP的靶场搭建指南
- 【干货】大数据量下,58同城mysql实践!
- 如何预先处理电影评论数据以进行情感分析
- 如何在Python中从零开始实现随机森林
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【笔记】《C++Primer》—— 第19章:特殊工具与技术
- 【翻译】C++14的新特性简介
- Python 为什么要有 pass 语句?
- 【翻译】C++17的新特性简介
- 各类SQL日期时间处理方法
- 这可能是最全最实用的Vim操作集合
- 个人珍藏的80道多线程并发面试题(1-10答案解析)
- 理解DOM Diff算法
- 腾讯云ES集群通过COS实现跨地域备份与恢复
- Thymeleaf一篇就够了
- python scipy.stats实现各种常见的统计分布
- 操作系统基础 - 文件系统
- Linux升级OpenSSH修复高危漏洞
- Pytest之收集用例及命令行参数
- CVE-2020-14645:Weblogic远程代码执行复现