java學(xué)習(xí)

          java學(xué)習(xí)

           

          設(shè)計(jì)模式之模擬jdk的動(dòng)態(tài)代理

          jdk的動(dòng)態(tài)代理模式的目標(biāo)類和動(dòng)態(tài)生成的代理類都要實(shí)現(xiàn)同一個(gè)接口。
          public interface MoveAble {
          void move();
          }
          public interface InvocationHandler {
          public void invoke(Object o, Method m);
          }
          public class Tank1 implements MoveAble{
          @Override
          public void move() {
          System.out.println("moving");
          }
          }
          public class TimeHandler implements InvocationHandler{
          private Object target;
          public TimeHandler(Object target) {
          super();
          this.target = target;
          }
          @Override
          public void invoke(Object o, Method m) {
          long start = System.currentTimeMillis();
          System.out.println("starttime:" + start);
          System.out.println(o.getClass().getName());
          try {
          m.invoke(target);
          } catch (Exception e) {
          e.printStackTrace();
          }
          long end = System.currentTimeMillis();
          System.out.println("time:" + (end-start));
          }
          }
          public class Proxy {
          public static Object newProxyInstance(Class infce, InvocationHandler invocationHandler) throws Exception { //JDK6 Complier API, CGLib, ASM
          String methodStr = "";
          String rt = "\r\n";
          Method[] methods = infce.getMethods();
          for(Method m : methods) {
          Class<?> returnType = m.getReturnType();
          methodStr += "@Override" + rt + 
          "public  "+returnType+" " + m.getName() + "() {" + rt +
          "    try {" + rt +
          "    Method md = " + infce.getName() + ".class.getMethod(\"" + m.getName() + "\");" + rt +
          "    h.invoke(this, md);" + rt +
          "    }catch(Exception e) {e.printStackTrace();}" + rt +
          "}";
          }
          String src = 
          "package proxy.tank;" +  rt +
          "import java.lang.reflect.Method;" + rt +
          "public class $Proxy1 implements " + infce.getName() + "{" + rt +
          "    public $Proxy1(InvocationHandler h) {" + rt +
          "        this.h = h;" + rt +
          "    }" + rt +
          "    proxy.tank.InvocationHandler h;" + rt +
          methodStr +
          "}";
          String fileName = 
          "d:/src/proxy/tank/$Proxy1.java";
          File f = new File(fileName);
          FileWriter fw = new FileWriter(f);
          fw.write(src);
          fw.flush();
          fw.close();
          //compile
          JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
          StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
          Iterable units = fileMgr.getJavaFileObjects(fileName);
          CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
          t.call();
          fileMgr.close();
          //load into memory and create an instance
          URL[] urls = new URL[] {new URL("file:/" + "d:/src/")};
          URLClassLoader ul = new URLClassLoader(urls);
          Class c = ul.loadClass("proxy.tank.$Proxy1");
          System.out.println(c);
          Constructor ctr = c.getConstructor(InvocationHandler.class);
          Object m = ctr.newInstance(invocationHandler);
          return m;
          }
          }
          public class Client {
          public static void main(String[] args) throws Exception {
          Tank1 t = new Tank1();
          InvocationHandler h = new TimeHandler(t);
          MoveAble m = (MoveAble)Proxy.newProxyInstance(MoveAble.class, h);
          m.move();
          }
          }

          posted on 2017-09-14 15:35 楊軍威 閱讀(129) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 禄丰县| 平遥县| 临沧市| 黔西| 沛县| 西林县| 怀宁县| 商水县| 西乌| 内丘县| 普兰店市| 瑞昌市| 乐昌市| 资兴市| 麟游县| 西盟| 都兰县| 崇礼县| 运城市| 南和县| 凉山| 宜良县| 茌平县| 如皋市| 绿春县| 马山县| 肃宁县| 兴义市| 逊克县| 巫山县| 温州市| 黄陵县| 兴和县| 惠州市| 大荔县| 永清县| 辽宁省| 罗甸县| 南丰县| 合江县| 仪征市|