动态代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理相关的知识,希望对你有一定的参考价值。

通过之前的静态代理可以发现,静态代理比较死板,是编译期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代理解决了这种问题,以后再总结一下。

 

以上是关于动态代理的主要内容,如果未能解决你的问题,请参考以下文章

动态 Rstudio 代码片段

是否可以动态编译和执行 C# 代码片段?

支持动态或静态片段的不同屏幕尺寸?

Forge Viewer - 如何在场景中访问(或获取渲染/片段代理)克隆的网格?

在ansible模板中使用动态组名称

代理模式(动态)