<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java學習

    java學習

     

    設計模式之模擬jdk的動態代理

    jdk的動態代理模式的目標類和動態生成的代理類都要實現同一個接口。
    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 楊軍威 閱讀(130) 評論(0)  編輯  收藏


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲无人区视频大全| 人人狠狠综合久久亚洲88| 亚洲人成电影院在线观看| 久久精品国产免费| 国产精品亚洲αv天堂无码| a一级毛片免费高清在线| 亚洲精品成人久久久| 国产va免费观看| 亚洲熟妇中文字幕五十中出| a级毛片免费完整视频| 国产精品亚洲精品日韩已满| 毛片基地看看成人免费| 亚洲爆乳精品无码一区二区三区| 拍拍拍无挡视频免费观看1000| 亚洲va无码专区国产乱码| 毛片在线播放免费观看| 亚洲精品亚洲人成在线麻豆| xxxxx免费视频| 亚洲欧美不卡高清在线| 国产大片线上免费看| 国产精品免费视频观看拍拍| 亚洲国产精品va在线播放| 亚洲第一网站免费视频| 亚洲一本一道一区二区三区| 四虎永久在线免费观看| 抽搐一进一出gif免费视频| 久久精品国产亚洲AV电影| 日韩精品福利片午夜免费观着| 久久久久亚洲精品无码网址色欲| 亚洲高清偷拍一区二区三区| 免费日本一区二区| 亚洲综合色7777情网站777| 国产乱弄免费视频| 美女在线视频观看影院免费天天看| 亚洲综合综合在线| 免费大香伊蕉在人线国产 | 亚洲Av无码乱码在线观看性色| 成在线人视频免费视频 | 亚洲人成图片小说网站| 蜜臀98精品国产免费观看| jzzijzzij在线观看亚洲熟妇|