您的位置:首页 > 其它

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

2015-02-15 10:35 393 查看
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: