码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-15 11:57:47      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

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();
    }
}

 

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

标签:

原文地址:http://www.cnblogs.com/leonkobe/p/4292570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!