動態代理模式學習

chyx413332087 13年前發布 | 2K 次閱讀 分布式監控

   前面初始了靜態代理,如果有新的代理,那么就右要寫上一個代理類,將真實代理作為代理的屬性,考慮到java機制1.3支持 類反射機制,因此聰明的人民,就知道了,可以動態代理  ,下面是代碼試驗
      1:首先定義公共接口,為什么要定義工作接口呢,這個問題,后面再說
**
 *
 * @author sunshine
 *  動態代理機制試驗
 */
public interface DyNamicInterFace {
 /**
  *
 * @Function: DyNamicInterFace.java
 * @Description: 動態代理請求
 *
 * @throws Exception
 * @return:返回結果描述
 * @throws:異常描述
 *
 * @version: v1.0.0
 * @author: 浪子
 * @date: 2011-8-25 下午08:29:02
 *
 * Modification History:
 * Date         Author          Version            Description
 *---------------------------------------------------------*
 * 2011-8-25     浪子           v1.0.0               修改原因
  */
 public void dyNamicRequest() throws Exception;
 
    public void dyNamicRequest(String name) throws Exception;
   
    public void dyNamicRequest(String name,int i) throws Exception;
}

 2:java動態代理,要用到java.lang.reflect.Method;java.lang.reflect.Proxy;  類,要實現動態必須實現java.lang.reflect.InvocationHandler(是代理實例的調用處理程序 實現的接口。)的接口 InvocationHandler接口中的invok方法,Proxy會執行這個要看jdk源碼 容積Constructor 構造器會構造 InvocationHandler h的實例,這就是為什么要實現InvocationHandler  接口
invok  方法第二個參數Method 是代理實現類的方法對象,第三個Method要調用的方法里面參數的值
實現動態代理,可以實現自己的接口,但是要動態代理必須要實現InvocationHandler    接口
         2:動態代理類 實現   InvocationHandler  接口
**
 * @author sunshine
 * 動態代理的動態實現類
 */
public class DyNamicInterFaceImpl implements DyNamicInterFace,InvocationHandler {
   public void dyNamicRequest(String name, int i) throws Exception {
  // TODO Auto-generated method stub 
 }
 public void dyNamicRequest() throws Exception {
  // TODO Auto-generated method stub
    System.out.println("aaaaa ");
 }
 public void dyNamicRequest(String name) throws Exception {
  // TODO Auto-generated method stub
    System.out.println("bbbb ");
 }
 private Object proxyObject;      //定義一個 Object  ,這樣在初始化的時候,或者其他方式,進行向上轉型成Object,
   public DyNamicInterFaceImpl()
   {
   
   }
   public DyNamicInterFaceImpl(Object proxyObject)
   {
    this.proxyObject=proxyObject;
   }
 public Object invoke(Object proxy, Method method, Object[] aobj)
   throws Throwable {
 
  System.out.println("開始調用 ");
 
  System.out.println("調用的MethodName="+method.getName());
 // System.out.println("調用的對象ObjectAobj="+aobj.length);
  int i=0;
  while(aobj!=null&&aobj.length>0&&aobj.length>i)
  {
  
   System.out.println("調用的對象ObjectAobj參數="+aobj[i]);
   i++;
  }
  Object o=method.invoke(proxyObject, aobj);
 
  System.out.println("invokeObject="+o);
  return o;
 }
 
 
 //客戶端測試
 public static void main(String []args) throws Exception
 {
 
 
  BusinessObject realObject=new BusinessObject();  //需要代理的業務對象
  DyNamicInterFaceImpl  dyNamic=new DyNamicInterFaceImpl(realObject); //動態代理對象
     從上面兩行代碼,可以看出是動態代理dyNamic ,代理 realObject真實對象
  Class  c=Class.forName("test.pro.Pen");
  Object o=c.newInstance();
  System.out.println("ssssss="+o);
 
      //      System.out.println("aaa="+c.getName());
           
    // Proxy.newProxyInstance(c.getClassLoader(), new Class[]{c}, dyNamic);
//DyNamicInterFace
為什么要轉型為 DyNamicInterFace   接口呢,這樣就要求 業務對象要implements 公共接口,因為在newProxyInstance中 第1個參數(類加載classLoader),第2個參數(代理類要實現的接口類),第三個參數,調用處理器,
  DyNamicInterFace dyNamicObjec=(DyNamicInterFace)Proxy.newProxyInstance(DyNamicInterFace.class.getClassLoader(),new Class[]{DyNamicInterFace.class}, dyNamic);    
  //DyNamicInterFace dyNamicObjec=(DyNamicInterFace)Proxy.newProxyInstance(realObject.getClass().getClassLoader(), realObject.getClass().getInterfaces(), dyNamic);   
  dyNamicObjec.dyNamicRequest();
     // o.dyNamicRequest();
  dyNamicObjec.dyNamicRequest("123");
   //  System.out.println("object="+o.getClass().getName());
  dyNamicObjec.dyNamicRequest("1234", 1);
 }
 測試結果:
testPen
ssssss=test.pro.Pen@affc70
開始調用
調用的MethodName=dyNamicRequest
BusinessObject
invokeObject=null
開始調用
調用的MethodName=dyNamicRequest
調用的對象ObjectAobj參數=123
BusinessObject===123
invokeObject=null
開始調用
調用的MethodName=dyNamicRequest
調用的對象ObjectAobj參數=1234
調用的對象ObjectAobj參數=1
BusinessObject==1234
BusinessObjectI==1
invokeObject=null

 本文由用戶 chyx413332087 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!