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

动态代理

时间:2016-03-18 14:46:51      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

通过之前的静态代理可以发现,静态代理比较死板,是编译期code好代理对象代码,再由jvm转换成字节码,代理对象就已经存在了。

  而且,每个对象都要自定义一个自己的一个代理对象。

  而动态代理,则是通过了java的反射机制,在程序的运行期动态的活的代理对象。

   

   下面看个小例子吧:

 

 

1、上层接口

package com.cn.proxy;
/**
* Created by xieguoliang on 16/3/17.
* 代理和被代理类接口
*/
public interface IClothProduct {
   int createCloth();
}

2、接口实现类
package com.cn.proxy;

/**
* Created by xieguoliang on 16/3/17.
*/
public class NikeProduct implements IClothProduct {

   @Override
   public int createCloth() {
       System.out.print("nike生产衣服");
       return 1;
   }

}

3、动态代理类生成对象
package com.cn.proxy;

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

/**
* Created by xieguoliang on 16/3/17.
*/
public class ProxyProduct implements InvocationHandler {

   private Object target;

   /**
    * 绑定代理类  并返回一个代理对象
    * @param target
    * @return
    */
   public Object bind(Object target) {
       this.target = target;
       return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
   }

   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       System.out.print("进入代理类----");
       //执行并且返回值
       Object o = method.invoke(target, args);
       System.out.print("代理类执行完毕");
       return o;
   }

}



4、测试类
package com.cn.proxy;

/**
* Created by xieguoliang on 16/3/17.
*/
public class ProxyTest {

   public static void main(String[] args) {
       ProxyProduct p = new ProxyProduct();
       IClothProduct n = (IClothProduct) p.bind(new NikeProduct());
       int a = n.createCloth();
       System.out.print(a);

   }
}


jdk的代理必须依赖于接口,这个是其缺陷。但是cglib代理解决了这种问题,以后再总结一下。

 

动态代理

标签:

原文地址:http://www.cnblogs.com/guoliangxie/p/5291999.html

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