动态代理例子

package com.bjsxt.proxy;

public interface Moveable {
 void move();
 
}

 

package com.bjsxt.proxy;

import java.util.Random;


public class Tank implements Moveable {

 
 public void move() {
  
  System.out.println("Tank Moving...");
  try {
   Thread.sleep(new Random().nextInt(10000));
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  
 }

 }

package com.bjsxt.proxy;

import java.lang.reflect.Method;

public interface InvocationHandler {
 public void invoke(Object o, Method m);
}

 

package com.bjsxt.proxy;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler{
 
 private Object target;

 

 public TimeHandler(Object target) {
  super();
  this.target = target;
 }

 

 
 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));
 }

}

 

package com.bjsxt.proxy;

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

public class Proxy {
 public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASM
  String methodStr = "";
  String rt = "/r/n";
  
  Method[] methods = infce.getMethods();
  /*
  for(Method m : methods) {
   methodStr += "@Override" + rt +
       "public void " + m.getName() + "() {" + rt +
        "   long start = System.currentTimeMillis();" + rt +
       "   System.out.println(/"starttime:/" + start);" + rt +
       "   t." + m.getName() + "();" + rt +
       "   long end = System.currentTimeMillis();" + rt +
       "   System.out.println(/"time:/" + (end-start));" + rt +
       "}";
  }
  */
  for(Method m : methods) {
   methodStr += "@Override" + rt +
       "public void " + 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 com.bjsxt.proxy;" +  rt +
   "import java.lang.reflect.Method;" + rt +
   "public class $Proxy1 implements " + infce.getName() + "{" + rt +
   "    public $Proxy1(InvocationHandler h) {" + rt +
   "        this.h = h;" + rt +
   "    }" + rt +
   
   
   "    com.bjsxt.proxy.InvocationHandler h;" + rt +
       
   methodStr +
   "}";
  String fileName =
   "d:/src/com/bjsxt/proxy/$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("com.bjsxt.proxy.$Proxy1");
  System.out.println(c);
  
  Constructor ctr = c.getConstructor(InvocationHandler.class);
  Object m = ctr.newInstance(h);
  //m.move();

  return m;
 }
}
//可以吧上面动态生成代理对象的类去掉换成 生成的类,然后分析, 再加上这段动态生成的代码就好理解了。

 

 

package com.bjsxt.proxy;
import java.lang.reflect.Method;
public class $Proxy1 implements com.bjsxt.proxy.Moveable{
    public $Proxy1(InvocationHandler h) {
        this.h = h;
    }
    com.bjsxt.proxy.InvocationHandler h;

public void move() {
    try {
    Method md = com.bjsxt.proxy.Moveable.class.getMethod("move");
    h.invoke(this, md);
    }catch(Exception e) {e.printStackTrace();}
}}

 

 

这是尚学堂马士兵老师讲的代码例子,自己学习用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值