<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)  編輯  收藏


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一个人看的www在线免费视频| 久久综合亚洲色HEZYO社区| 午夜亚洲WWW湿好爽| 女人18毛片水最多免费观看| 亚洲看片无码在线视频| 在线看片人成视频免费无遮挡| 亚洲宅男天堂a在线| 免费看黄视频网站| 亚洲日本久久久午夜精品| 美女视频黄的全免费视频| 亚洲AV成人噜噜无码网站| 99视频在线精品免费观看6| 亚洲乱色熟女一区二区三区蜜臀| 免费黄色一级毛片| 日本一区二区三区免费高清在线| 亚洲国产一级在线观看 | 亚洲精品自产拍在线观看| 九九视频高清视频免费观看| 国产乱辈通伦影片在线播放亚洲| 中文字幕在线免费播放| 亚洲人成电影福利在线播放 | 女人毛片a级大学毛片免费| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 免费国产a国产片高清| 一区二区视频免费观看| 亚洲AV无码1区2区久久| 无码日韩精品一区二区免费| 亚洲精品久久无码av片俺去也 | 久久久久亚洲AV片无码下载蜜桃| 日本h在线精品免费观看| 亚洲欧美精品午睡沙发| 亚洲精品乱码久久久久久不卡| 精品在线免费观看| 亚洲狠狠成人综合网| 久久久久亚洲精品男人的天堂| 亚欧免费一级毛片| 立即播放免费毛片一级| 亚洲av成人无码久久精品| 免费看片A级毛片免费看| 中文毛片无遮挡高清免费| 亚洲另类春色国产精品|