亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java動態代理的應用詳解

2019-11-26 16:08:18
字體:
來源:轉載
供稿:網友

動態代理其實就是java.lang.reflect.Proxy類動態的根據您指定的所有接口生成一個class byte,該class會繼承Proxy類,并實現所有你指定的接口(您在參數中傳入的接口數組);然后再利用您指定的classloader將 class byte加載進系統,最后生成這樣一個類的對象,并初始化該對象的一些值,如invocationHandler,以即所有的接口對應的Method成員。 初始化之后將對象返回給調用的客戶端。這樣客戶端拿到的就是一個實現你所有的接口的Proxy對象。請看實例分析:

復制代碼 代碼如下:

package com.fans.common.proxy;

public interface BusinessProcessor {
  public void processBusiness();
}


復制代碼 代碼如下:

package com.fans.common.proxy;
/**
 * 業務處理類
 * @author fanshadoop
 *
 */
public class BusinessProcessorImpl implements BusinessProcessor {

 @Override
 public void processBusiness() {
  System.out.println("processing business.....");

 }

}


復制代碼 代碼如下:

package com.fans.common.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 業務代理類
 * @author fanshadoop
 *
 */
public class BusinessProcessorHandler implements InvocationHandler {

 private Object target = null;

 BusinessProcessorHandler(Object target) {
  this.target = target;
 }

 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  System.out
    .println("You can do something here before process your business");
  Object result = method.invoke(target, args);
  System.out
    .println("You can do something here after process your business");
  return result;
 }

}


復制代碼 代碼如下:

package com.fans.common.proxy;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  BusinessProcessorImpl bpimpl = new BusinessProcessorImpl();
  BusinessProcessorHandler handler = new BusinessProcessorHandler(bpimpl);
  BusinessProcessor bp = (BusinessProcessor) Proxy.newProxyInstance(
    bpimpl.getClass().getClassLoader(), bpimpl.getClass()
      .getInterfaces(), handler);
  bp.processBusiness();

  System.out.println(bp.getClass().getName());
  printClassDefinition(bp.getClass());
 }

 public static String getModifier(int modifier) {
  String result = "";
  switch (modifier) {
  case Modifier.PRIVATE:
   result = "private";
  case Modifier.PUBLIC:
   result = "public";
  case Modifier.PROTECTED:
   result = "protected";
  case Modifier.ABSTRACT:
   result = "abstract";
  case Modifier.FINAL:
   result = "final";
  case Modifier.NATIVE:
   result = "native";
  case Modifier.STATIC:
   result = "static";
  case Modifier.SYNCHRONIZED:
   result = "synchronized";
  case Modifier.STRICT:
   result = "strict";
  case Modifier.TRANSIENT:
   result = "transient";
  case Modifier.VOLATILE:
   result = "volatile";
  case Modifier.INTERFACE:
   result = "interface";
  }
  return result;
 }

 public static void printClassDefinition(Class clz) {

  String clzModifier = getModifier(clz.getModifiers());
  if (clzModifier != null && !clzModifier.equals("")) {
   clzModifier = clzModifier + " ";
  }
  String superClz = clz.getSuperclass().getName();
  if (superClz != null && !superClz.equals("")) {
   superClz = "extends " + superClz;
  }
  Class[] interfaces = clz.getInterfaces();
  String inters = "";
  for (int i = 0; i < interfaces.length; i++) {
   if (i == 0) {
    inters += "implements ";
   }
   inters += interfaces[i].getName();
  }
  System.out.println(clzModifier + clz.getName() + " " + superClz + " "
    + inters);
  System.out.println("{");
  Field[] fields = clz.getDeclaredFields();
  for (int i = 0; i < fields.length; i++) {
   String modifier = getModifier(fields[i].getModifiers());
   if (modifier != null && !modifier.equals("")) {
    modifier = modifier + " ";
   }
   String fieldName = fields[i].getName();
   String fieldType = fields[i].getType().getName();
   System.out.println("    " + modifier + fieldType + " " + fieldName
     + ";");
  }

  System.out.println();

  Method[] methods = clz.getDeclaredMethods();
  for (int i = 0; i < methods.length; i++) {
   Method method = methods[i];

   String modifier = getModifier(method.getModifiers());
   if (modifier != null && !modifier.equals("")) {
    modifier = modifier + " ";
   }
   String methodName = method.getName();
   Class returnClz = method.getReturnType();
   String retrunType = returnClz.getName();

   Class[] clzs = method.getParameterTypes();
   String paraList = "(";
   for (int j = 0; j < clzs.length; j++) {
    paraList += clzs[j].getName();
    if (j != clzs.length - 1) {
     paraList += ", ";
    }
   }
   paraList += ")";
   clzs = method.getExceptionTypes();
   String exceptions = "";
   for (int j = 0; j < clzs.length; j++) {
    if (j == 0) {
     exceptions += "throws ";
    }
    exceptions += clzs[j].getName();
    if (j != clzs.length - 1) {
     exceptions += ", ";
    }
   }
   exceptions += ";";
   String methodPrototype = modifier + retrunType + " " + methodName
     + paraList + exceptions;

   System.out.println("    " + methodPrototype);
  }
  System.out.println("}");
 }
}


運行結果:
復制代碼 代碼如下:

You can do something here before process your business
processing business.....
You can do something here after process your business
$Proxy0
$Proxy0 extends java.lang.reflect.Proxy implements com.fans.common.proxy.BusinessProcessor
{
    java.lang.reflect.Method m1;
    java.lang.reflect.Method m3;
    java.lang.reflect.Method m0;
    java.lang.reflect.Method m2;

    boolean equals(java.lang.Object);
    java.lang.String toString();
    int hashCode();
    void processBusiness();
}


類BusinessProcessorHandler實現了InvocationHandler接口的invoke方法,這個類就是Proxy最終調用固定接口方法。

很明顯,Proxy.newProxyInstance方法會做如下幾件事:
    1,根據傳入的第二個參數interfaces動態生成一個類,實現interfaces中的接口,該例中即BusinessProcessor接口的processBusiness方法。并且繼承了Proxy類,重寫了hashcode,toString,equals等三個方法。具體實現可參看 ProxyGenerator.generateProxyClass(...); 該例中生成了$Proxy0類
    2,通過傳入的第一個參數classloder將剛生成的類加載到jvm中。即將$Proxy0類load
    3,利用第三個參數,調用$Proxy0的$Proxy0(InvocationHandler)構造函數 創建$Proxy0的對象,并且用interfaces參數遍歷其所有接口的方法,并生成Method對象初始化對象的幾個Method成員變量
    4,將$Proxy0的實例返回給客戶端。
現在好了。我們再看客戶端怎么調就清楚了。
    1,客戶端拿到的是$Proxy0的實例對象,由于$Proxy0繼承了BusinessProcessor,因此轉化為BusinessProcessor沒任何問題。
         BusinessProcessor bp = (BusinessProcessor)Proxy.newProxyInstance(....);
    2,bp.processBusiness();
         實際上調用的是$Proxy0.processBusiness();那么$Proxy0.processBusiness()的實現就是通過InvocationHandler去調用invoke方法啦!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97成人在线视频| 国产亚洲精品美女久久久久| yellow中文字幕久久| 精品国产一区二区三区在线观看| 色青青草原桃花久久综合| 视频在线一区二区| 一区二区三区久久精品| 成人国产精品久久久久久亚洲| 日韩精品高清视频| 亚洲香蕉av在线一区二区三区| 欧美大片免费观看在线观看网站推荐| 亚洲欧美日本精品| 91麻豆国产语对白在线观看| 欧美一区二区三区免费视| 亚洲黄色在线看| 亚洲最大福利网站| 国产精品一久久香蕉国产线看观看| 欧美人交a欧美精品| 日韩免费精品视频| 国内精品久久久久影院优| 中文字幕欧美日韩精品| 91在线免费看网站| 黄色成人在线免费| 欧美刺激性大交免费视频| 欧美成人精品激情在线观看| 国产精品白丝jk喷水视频一区| 97在线观看免费| 欧美性猛交xxxx乱大交蜜桃| 精品久久久久久中文字幕大豆网| 国产一区二区三区在线视频| 国产日韩欧美电影在线观看| 久久影院免费观看| 成人av资源在线播放| 欧美黑人巨大xxx极品| 国产在线观看一区二区三区| 欧美一级大片视频| 久久久久久久久久久91| 国产精品美女无圣光视频| 欧美激情手机在线视频| 国产99久久精品一区二区| 国产日韩欧美中文在线播放| 韩日欧美一区二区| 日产精品99久久久久久| 日本一区二区三区四区视频| 久久久国产视频91| 欧美夜福利tv在线| 日韩精品视频在线播放| 日韩激情第一页| 一区二区欧美激情| 色噜噜狠狠狠综合曰曰曰88av| 91久久精品在线| 国产欧美在线播放| 久久成人精品视频| 亚洲无限乱码一二三四麻| 国产精品第一视频| 亚洲国产精品va在线观看黑人| 国产精品偷伦免费视频观看的| 在线看国产精品| 欧美日韩性生活视频| 日韩欧美一区二区三区久久| 亚洲电影免费观看| 久久久久久网站| 亚洲欧美日韩视频一区| 亚洲片在线资源| 日韩在线视频导航| 这里只有精品视频在线| 精品久久国产精品| 亚洲石原莉奈一区二区在线观看| 国产精品露脸av在线| 国产精品普通话| 久久精品男人天堂| 久久中文精品视频| 日本一欧美一欧美一亚洲视频| 日韩av在线免播放器| 亚洲精品91美女久久久久久久| 91中文在线视频| 久久亚洲精品国产亚洲老地址| 欧美在线精品免播放器视频| 欧美中文字幕在线| 亚洲毛片在线观看| 亚洲国产精品人久久电影| 亚洲精品在线不卡| 国产欧美日韩丝袜精品一区| 久久久久久国产精品久久| 国产精品电影观看| 欧美另类在线观看| 精品久久久久久国产| 欧美美女18p| 日韩精品免费视频| 国产精品久久久久9999| 成人免费淫片aa视频免费| 一区二区三区精品99久久| 中文欧美日本在线资源| 久久综合色88| 日韩一区二区福利| 精品人伦一区二区三区蜜桃网站| 欧美日韩国产黄| 91久久精品国产91性色| 亚洲免费伊人电影在线观看av| 日本电影亚洲天堂| 久久久亚洲欧洲日产国码aⅴ| 国产国语videosex另类| 亚洲片国产一区一级在线观看| 日韩av在线天堂网| 国产精品高潮呻吟视频| 91精品国产91| 日韩激情第一页| 97精品视频在线观看| 亚洲一区二区三区乱码aⅴ| 欧美成人在线免费视频| 亚洲成av人乱码色午夜| 日韩电视剧在线观看免费网站| 亚洲精品久久久久久久久久久久| 欧美极品在线视频| 欧美性理论片在线观看片免费| 精品在线欧美视频| 97久久久免费福利网址| 成人福利在线视频| 日本中文字幕久久看| 国产精品爽爽爽| 国产偷亚洲偷欧美偷精品| 亚洲韩国欧洲国产日产av| 国产成人高清激情视频在线观看| 久久亚洲综合国产精品99麻豆精品福利| 一区二区三区美女xx视频| 日韩av大片免费看| 亚洲欧美三级在线| www.欧美三级电影.com| 国产日韩中文字幕在线| 成人网址在线观看| 欧美性xxxxxxxxx| 2019中文字幕免费视频| www.日韩欧美| 亚洲毛片一区二区| 亚洲色图35p| 国产精品一区二区三| 久久精品视频va| 色综合色综合久久综合频道88| 久久成人av网站| 福利二区91精品bt7086| 美女精品视频一区| 91免费在线视频| 2019最新中文字幕| 午夜精品久久久久久久99热浪潮| 奇门遁甲1982国语版免费观看高清| 97国产精品免费视频| 日韩免费精品视频| 亚洲国产精品系列| 在线观看91久久久久久| 亚洲片国产一区一级在线观看| 欧美大尺度电影在线观看| 久久婷婷国产麻豆91天堂| 色狠狠久久aa北条麻妃| 免费91在线视频| 欧美大片va欧美在线播放| 成人av资源在线播放| 在线观看亚洲视频| 日韩有码视频在线| 日韩在线观看精品| 欧美一级视频一区二区| 日韩亚洲精品视频| 怡红院精品视频| 久久人人爽人人爽人人片亚洲| 综合网中文字幕|