设计模式_代理模式_动态代理

转自:https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/index.html

动态代理是指在运行时动态生成代理类。即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader。与静态处理类相比,动态类有诸多好处。首先,不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦。如果接口有变动,则真实主题和代理类都要修改,不利于系统维护;其次,使用一些动态代理的生成方法甚至可以在运行时制定代理类的执行逻辑,从而大大提升系统的灵活性。

动态代理类使用字节码动态生成加载技术,在运行时生成加载类。生成动态代理类的方法很多,如,JDK 自带的动态处理CGLIB、Javassist 或者 ASM 库。JDK 的动态代理使用简单,它内置在 JDK 中,因此不需要引入第三方 Jar 包,但相对功能比较弱。CGLIB 和 Javassist 都是高级的字节码生成库,总体性能比 JDK 自带的动态代理好,而且功能十分强大。ASM 是低级的字节码生成工具,使用 ASM 已经近乎于在使用 Java bytecode 编程,对开发人员要求最高,当然,也是性能最好的一种动态代理生成工具。但 ASM 的使用很繁琐,而且性能也没有数量级的提升,与 CGLIB 等高级字节码生成工具相比,ASM 程序的维护性较差,如果不是在对性能有苛刻要求的场合,还是推荐 CGLIB 或者 Javassist。

以清单 1 所示代码中的 DBQueryProxy 为例,使用动态代理生成动态类,替换上例中的 DBQueryProxy。首先,使用 JDK 的动态代理生成代理对象。JDK 的动态代理需要实现一个处理方法调用的 Handler,用于实现代理方法的内部逻辑。

 1 public class DBQueryHandler implements InvocationHandler {
 2     IDBQuery realQuery = null;//定义主题接口
 3
 4     @Override
 5     public Object invoke(Object proxy, Method method, Object[] args)
 6             throws Throwable {
 7         //如果第一次调用,生成真实主题
 8         if (realQuery == null) {
 9             realQuery = new DBQuery();
10         }
11         //返回真实主题完成实际的操作
12         return realQuery.request();
13     }
14
15 }

原文地址:https://www.cnblogs.com/rocker-pg/p/8999459.html

时间: 2024-10-13 04:23:08

设计模式_代理模式_动态代理的相关文章

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理

Java设计模式-代理模式之动态代理(附源代码分析)

Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代理是在编译的时候就确定了代理类详细类型.假设有多个类须要代理.那么就得创建多个. 另一点,假设Subject中新增了一个方法,那么相应的实现接口的类中也要相应的实现这些方法. 动态代理的做法:在执行时刻.能够动态创建出一个实现了多个接口的代理类.每一个代理类的对象都会关联一个表示内部处理逻辑的Inv

设计模式(11)--代理模式之动态代理

保护代理 在调用方法前后,进行一些动作. 动态代理之所以叫动态代理是因为,是运行时才将它的类创建出来. 日志 . 连接. 事务. Java在java.lang.reflect包中有自己的代理支持,利用这个包你可以要运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类.因为实际的代理类是在运行时创建类,我们称这个Java技术为:动态代理. Java为你创建Proxy类,因为Proxy不是你直接实现的,你让代理执行的代理应该放在InvocationHandler中. In

谈谈Java的代理模式及动态代理

Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式无论学习静态代理或动态代理,我们都要先了解一下代理模式. 先看百度百科的定义: 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 直接看定义可能有些难以理解,我们就以生活中具体的实例

动态代理模式——JDK动态代理

今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理逻辑方法. 在Java中,有很多的动态代理技术.如:JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术有两种:一种是JDK动态代理,这是JDK自带的功能:另一种就是CGLIB,这是第三方提供的一种技术. 这次主要讲的是JDK动态代理和CGLIB动态代理.在JDK动态代理中,我们

程序设计优化——(2)代理模式之动态代理

简介:动态代理是指在运行时,动态生成代理类.即代理类的字节码将在运行时生成并载入当前的ClassLoader.与静态代理类相比,有诸多好处.不需要为真实主题写一个形式上完全一样的封装类,若接口过多,则会代理接口也很多,接口稍微改动,代理接口也要进行变更:其次,使用动态代理可以在运行时指定代理类的执行逻辑,从而提升系统的灵活性. 动态代理有JDK自带的动态代理,CGLIB.Javassist或者ASM库.JDK的动态代理简单,内置在JDK中,因此不需要引入第三方jar包,但功能较弱.CGLIB和J

代理模式之动态代理

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //接口 interface MyInterface { public void action(); } // 被代理类 class MyObject implements MyInterface { @Override public void action() { System.

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

代理模式_静态代理

一.代理模式_静态代理 来到北京.首先第一件事就是租房子.然而北京租房子80%的都要通过中介,中介获得房屋出租的权限,出租房屋给房客.我们以这个很现实很亲近我们生活的例子来认识代理模式中的静态代理. 二.代理模式中的角色划分 2.1抽象角色:把真实角色和代理角色所共有的行为抽成一个接口或者抽象类. 2.2真实角色:被代理角色所代理的角色. 2.3代理角色:代理真实角色做某些工作. 三.静态代理示例 3.1抽象角色(把真实角色房东和代理角色中介所共有的行为出租房屋抽象成一个接口) package

【设计模式】代理模式:静态代理,动态代理,spring aop

代理模式分为静态代理和动态代理.我们拿链家来举例子,我们本人是真实的对象,有真实的业务需求:需要去找房子:链家是中介,是代理类,他来帮我执行找房子的这个操作. 静态代理: 1.实现一个接口 public interface SearchHome { public void search(); } 2.构建实现接口的委托类 public class Master implements SearchHome { @Override public void search() { System.out.