java學(xué)習(xí)

          java學(xué)習(xí)

           

          設(shè)計模式之模擬jdk的動態(tài)代理

          jdk的動態(tài)代理模式的目標(biāo)類和動態(tài)生成的代理類都要實現(xiàn)同一個接口。
          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) 評論(0)  編輯  收藏


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


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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 厦门市| 本溪市| 岳普湖县| 高密市| 和静县| 辰溪县| 铜梁县| 高邮市| 杭州市| 宜春市| 个旧市| 蓬溪县| 米林县| 舒兰市| 平湖市| 赣榆县| 葵青区| 曲靖市| 永善县| 芜湖市| 崇礼县| 保亭| 泸水县| 嘉定区| 华宁县| 北安市| 紫金县| 吴江市| 江川县| 宁蒗| 玉山县| 祁连县| 藁城市| 济南市| 上林县| 内江市| 剑川县| 从江县| 岑溪市| 泸西县| 新田县|