动态代理

来源:互联网 发布:博思数据 igbt销量 编辑:程序博客网 时间:2024/05/17 09:06
动态代理有什么作用呢?
作用非常大,在很多底层框架中都会用得到,比如struts,Spring等都用到了动态代理,它的作用很简单,就是将你要使用的类,重新生成一个子类或本类,这样框架就可以利用这个新生成的类做一些事情,比如在该类的方法前后加一些代码。。这样的话,你想像一下,你是不是不用修改任何已经编写好的代码,只要使用代理就可以灵活的加入任何东西,将来不喜欢了,不用也不会影响原来的代码。
一 为什么要用动态代理设计模式呢? 
    比如下面的例子中,在MyClass中,有个方法doMethod().在一般的项目或者系统中,Class你是看不到他的源代码的。而仅仅给你调用他的接口MyInterface.此时如果你想在doMethod()方法中加一段代码,比如打印日志消息,增加权限判断,这个时候该怎么办?如何在不修改源代码并且在没有源代码的情况下实现呢?这个时候动态代理模式我们就用上了. 
    下面有4个类.我想不用我一一指出,有基本功的朋友们,应该能看懂吧.其中有个你要修改的方法类.一个该方法类的接口.一个代理对象,还有一个当然就是测试用的main方法了. 
    其中,代理类MyInterceptor是实现的核心.但实现方法都是固定的.只要根据你的需求,按照我下面的示例摸板代码,你很快的就能够实现自己的动态代理模式. 
    二 核心思想与概念 
连接点(Joinpoint): 程序执行的某个特定位置, 比如方法调用前后, 类初始化前,异常抛出之后. 
增强(Advice): 植入到目标类的连接点上的程序代码. 
目标对象(Target): 被植入增强的类, 比如上面简化之后的BookService. 
代理(Proxy): 被植入增强之后产生的结果类. 
1)代理对象实现InvocationHandler接口 
2)通过Proxy.newProxyInstance来调用 
    把下面的代码拷贝到你自己的机器上,开心的运行一次吧^-^ 

Java代码  收藏代码
  1. //MyClass.java  
  2. //实现接口的类  
  3. public class MyClass implements MyInterface {  
  4.   
  5.     public void doMethod() {  
  6.         System.out.println("do my method!");  
  7.     }  
  8. }  



Java代码  
  1. //MyInterceptor.java  
  2. import java.lang.reflect.InvocationHandler;  
  3. import java.lang.reflect.Method;  
  4.   
  5. //代理对象  
  6. public class MyInterceptor implements InvocationHandler {  
  7.       
  8.     private Object target;  
  9.       
  10.     public Object getTarget() {  
  11.         return target;  
  12.     }  
  13.   
  14.     public void setTarget(Object target) {  
  15.         this.target = target;  
  16.     }  
  17.   
  18.     public void beforeMethod(Method m) {  
  19.           
  20.         System.out.println(m.getName() + " start");  
  21.     }  
  22.       
  23.     public Object invoke(Object proxy, Method m, Object[] args)  
  24.             throws Throwable {  
  25.         beforeMethod(m);  
  26.         m.invoke(target, args);  
  27.         return null;  
  28.     }  
  29. }  



Java代码  
  1. //MyInterface.java  
  2. //接口  
  3. public interface MyInterface {  
  4.     public void doMethod();  
  5. }  


Java代码  
  1. //Test.java  
  2. import java.lang.reflect.Proxy;  
  3.   
  4. //具体实现  
  5. public class Test {  
  6.     public static void main(String[] args) {  
  7.         MyInterface myInterface = new MyClass();  
  8.         MyInterceptor myInterceptor = new MyInterceptor();  
  9.         myInterceptor.setTarget(myInterface);  
  10.         MyInterface miProxy = (MyInterface) Proxy.newProxyInstance(myInterface.getClass().getClassLoader(),  
  11.                 new Class[] { MyInterface.class }, myInterceptor);  
  12.   
  13.         miProxy.doMethod();  
  14.     }  
  15.   
  16. }  
0 0