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

JDK 提供的动态代理的两个相关的类:InvocationHandler 和 Proxy

一:InvocationHandler 
  InvocationHandler 接口只提供了一个接口方法
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  1 Object proxy 被代理的对象  2 Method method 被代理对象的实现方法  3 Object[] args 被代理对象的方法参数
  这三个条件决定类在调用被代理类的具体什么方法时,生成代理对象

二:Proxy
  Proxy 提供了一个获取实例的静态方法
  public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
  1 ClassLoader loader 被代理对象的类加载器  2 Class<?>[] interfaces 被代理对象实现的所有接口  3 InvocationHandler h 被代理对象的动态代理类
  Proxy 会默认实现被代理类的所有接口方法,方法默认都返回null ,什么业务逻辑都没做,通过被代理对象的ClassLoader 获取实际处理逻辑,
  通过动态代理类InvocationHandler 做业务逻辑中的特殊处理,AOP 就是这样实现的

  其他:
  动态代理在每一次调用代理对象的方法的时候,都会经过InvocationHandler 实现的类的invoke 方法的拦截,做特殊业务处理

三:接口
  

package dmode.proxy;

/**
 * 类描述:  接口
 * @version 1.0  CreateDate: 2015-2-13
 *
 * @updateDate
 * @updatePerson
 * @declare
 */
public interface Subject {

    /**
     * 方法描述:打卡
     */
    public void punchCard(String name,String company);

    /**
     * 方法描述:上班
     */
    public void beOnDuty();

    /**
     * 方法描述:下班
     */
    public void offDuty();
}

四:实现类

package dmode.proxy;

/**
 * 类描述:  员工
 * @version 1.0  CreateDate: 2015-2-13
 *
 * @updateDate
 * @updatePerson
 * @declare
 */
public class Employer implements Subject{

    /**
    *@see dmode.proxy.Subject#punchCard()
    */
    @Override
    public void punchCard(String name,String company) {
        System.out.println(name + "上班打卡.......公司:" + company);
    }

    /**
    *@see dmode.proxy.Subject#beOnDuty()
    */
    @Override
    public void beOnDuty() {
        System.out.println("开始工作.......");
    }

    /**
    *@see dmode.proxy.Subject#offDuty()
    */
    @Override
    public void offDuty() {
        System.out.println("下班打卡.......");
    }

}

五:动态代理类

package dmode.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 类描述:  动态代理类
 * @version 1.0  CreateDate: 2015-2-13
 *
 * @updateDate
 * @updatePerson
 * @declare
 */
public class DynamicProxy implements InvocationHandler{

    //被代理实例
    Object object = null;

    public DynamicProxy(Object _obj){
        this.object = _obj;
    }
    /**
     * JDK 动态代理方法,对被代理类的方法进行代理
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //此处可以通过Method 来根据不同的方法做不同特色业务处理,利用反射
        Object result = method.invoke(this.object, args);
        return result;
    }

    /**
     * 方法描述:获取代理对象
     * @param subject
     * @return
     */
    public static <T extends Subject> T getProxy(Subject subject){
        ClassLoader classLoader = subject.getClass().getClassLoader();
        Class<?>[] interfaceArry = subject.getClass().getInterfaces();
        InvocationHandler invoHandler = new DynamicProxy(subject);
        Object object = Proxy.newProxyInstance(classLoader, interfaceArry,invoHandler);
        return (T)object;
    }

}

六:应用场景

package dmode.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 类描述:  入口
 * @version 1.0  CreateDate: 2015-2-13
 *
 * @updateDate
 * @updatePerson
 * @declare
 */
public class Acce {
    public static void main(String[] args) {
        Subject emp = new Employer();
        Subject dyProxy = DynamicProxy.getProxy(emp);
        dyProxy.punchCard("zzd","fencer");
        dyProxy.beOnDuty();
        dyProxy.offDuty();
    }
}
时间: 2024-10-21 20:56:25

设计模式之--代理模式(动态代理)的相关文章

设计模式--5.4 代理模式-动态代理

1.动态代理 (1)动态代理,是实现阶段不关心代理谁,而在运行阶段才指定代理哪一个对象.相对的说,上面两种 普通代理和强制代理,都是通过写代理类来获取代理,这种是静态代理. (2)区别:静态代理,需要写代理类,在代理之前要知道我代理的是哪个类: (3)类图 2.代码 接口类 package com.design.代理模式.动态代理; public interface IGamePlayer { void login(String username , String pwd); void kill

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

跟之前上一篇静态代理的差不多.这个是在执行的时候动态的产生代理对象,开始是不知道具体的代理对象,是传入具体对象,就产生该具体对象的代理对象.而之前的静态代理是预知要传入的具体对象交给哪一个代理对象执行. 代码实现. 首先定义抽象角色,他是代理对象和具体对象的共同接口.可以是接口,也可以是抽象类. //抽象角色 定义的是一种类型 具有某种共同行为的类型 public interface ProxyInterface{ //定义行为,代理对象和具体对象的共同行为 public void run();

设计模式之--静态代理及动态代理模式

原文链接:http://www.studyshare.cn/blog/details/1181/0 一.概念 代理模式:为其他对象提供一种代理类用以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用 另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,代理模式属于23中设计模式中的结构型设计模式. 代理模式可分为静态代理和动态代理. 代理结构如下图: 例如:客户(客户类)—>代购(代理类)—>海外下单(海外订单类),普通客户无法直接去海外下单,则向代购公司 下单,代

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

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

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

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

常用设计模式之代理(动态代理)

常用设计模式之代理(动态代理) UML Code1 1 interface Subject{void doSth();} 2 class RealSubject implements Subject{ 3 public void doSth(){ 4 System.out.println("RealSubject doSth...."); 5 } 6 } 7 class ProxyHandler implements InvocationHandler 8 { 9 private Ob

java 代理模式(静态代理、动态代理、Cglib代理) 转载

Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调

JAVA设计模式——代理(动态代理)

传送门:JAVA设计模式--代理(静态代理) 序言: 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 动态代理模式主要由四个元素共同构成: 1. 接口,接口中的方法是要真正去实现的 2. 被代理类,

【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用. 代理模式不会改变原来的接口和行为,仅仅是转由代理干某件事,代理能够控制原来的目标,比如:代理商,代理商仅仅会买东西,但并不会改变行为.不会制造东西. 让我们通过以下的代码好好理解一下这句话. 分类 静态代理和动态代理 静态代理 静态代理类图 代码演示样例 接口 pac