JDK与CGLIB的动态代理

日期:2014-08-04点击次数:9878

       代理模式是23种java常用设计模式之一。为其他对象提供一种代理以控制对这个对象的访问。可以在下面的场景中使用:权限、缓存、内容传递、错误处理、懒加载、调试、记录跟踪、性能优化、持久化、资源池、同步、事务。
一、JDK动态代理
1.定义目标接口。
 

public interface ModelManager {
  public void addModel(String  model);
}

 
2.定义目标类。
 

public class ModelManagerImpl implements ModelManager {
  public void addModel (String model) {
   System.out.println("添加模型:"+ model);
  }
}

 
3.创建动态代理类。JDK动态代理类需实现java.lang.reflect.InvocationHandler接口。
 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler{ 
 private Object targetObject;
 /*
  * 目标对象注入
  */
 public JDKProxy(Object targetObject){
  this.targetObject = targetObject;
 }
 
 /*
  * 创建代理对象
  */
 public Object getProxyObject(){
   Object proxyObject = Proxy.newProxyInstance(
     this.targetObject.getClass().getClassLoader(),
     this.targetObject.getClass().getInterfaces(), this);
   return proxyObject;
 }
 
 public Object invoke(Object proxyObject, Method method, Object[] args)
   throws Throwable {
   beforeHandle ();
   Object result = method.invoke(this.targetObject, args); //执行目标对象方法
afterHandle ()
   return result;
 }
 
 private void beforeHandle (){
   System.out.println("在执行目标方法前业务处理");
 }
 private void afterHandle (){
   System.out.println("在执行目标方法后业务处理");
 }
}
/**
* 实现类
*/
public class testProxy {
public static void main(String[] args) {
   JDKProxy proxy = new JDKProxy(new ModelManagerImpl ());
    ModelManager modelManager = (ModelManager)  proxy.getProxyObject();
   modelManager. addModel ("设备模型");
  }
}

 
二、CGLIB动态代理
1.定义目标类。
 

public class ModelManagerImpl {
  public void addModel (String model) {
   System.out.println("添加模型:"+ model);
  }
}

 
2.创建动态代理类。
CGLIB动态代理类需实现org.aopalliance.intercept.MethodInterceptor接口。
 

public class CglibProxy implements MethodInterceptor{
   private Object targetObject; 
public CglibProxy (Object targetObject){
   this.targetObject = targetObject;
  }
 
public Object getProxyObject()  {
Enhancer enhancer = new Enhancer();  //设置需要创建子类的类
   enhancer.setSuperclass(this. targetObject.getClass());
   enhancer.setCallback(this);
      return enhancer.create();// 创建代理对象  
}
  //实现MethodInterceptor接口方法
 public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
   beforeHandle ()
     Object result = proxy.invokeSuper(obj, args);
  afterHandle ()
   return result;
  }
  private void beforeHandle (){
   System.out.println("在执行目标方法前业务处理");
  }
  private void afterHandle (){
   System.out.println("在执行目标方法后业务处理");
  }
}
}
/**
* 实现类
*/
public class testProxy {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy(new ModelManagerImpl ());
     ModelManagerImpl modelManager =(ModelManagerImpl)proxy. getProxyObject ();
   modelManager. addModel ("设备模型");
  }
}

 
       JDK动态代理针对实现了接口的类生成代理,CGLIB是针对类实现代理;因此如果使用JDK动态代理就必须对目标类进行接口定义.
 
 

 软件部   王涛

 

姓名:
性别:
电话:
E-mail
问题:
问题描述: