设计模式 之 代理模式
下载 23种设计模式源码 :http://download.csdn.net/download/knight_black_bob/8936043
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
创建型模式,共五种:
工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式
结构型模式,共七种:
适配器模式 装饰器模式 代理模式 外观模式 桥接模式 组合模式 享元模式
行为型模式,共十一种:
策略模式 模板方法模式 观察者模式 迭代子模式 责任链模式 命令模式
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
马士兵 动态代理学习~~~~
package 设计模式.代理模式; public interface Moveable { void move(); }
package 设计模式.代理模式; public class Tank implements Moveable{ @Override public void move() { System.out.println("tank moving"); } }
package 设计模式.代理模式; public class TankTimeProxy implements Moveable{ private Moveable t; public TankTimeProxy(Moveable t) { this.t = t; } @Override public void move() { long startTime = System.currentTimeMillis(); System.out.println("startTime: "+startTime); t.move(); try { Thread.sleep(100); } catch (InterruptedException e) { } long endTime= System.currentTimeMillis(); System.out.println("endTime: "+endTime); System.out.println("运行时间为: "+(endTime-startTime) +"ms"); } }
package 设计模式.代理模式; import java.lang.reflect.Method; public interface InvocationHandler { void invoke(Object o,Method m); }
package 设计模式.代理模式; import java.lang.reflect.Method; public class LogInvocationHandler implements InvocationHandler{ private Object target; public LogInvocationHandler(Object target) { this.target = target; } @Override public void invoke(Object o, Method m) { System.out.println("Tank start..........."); try { m.invoke(target); } catch (Exception e) { } System.out.println("Tank stop.............."); } }
package 设计模式.代理模式; import java.io.File; import java.io.IOException; import java.util.StringTokenizer; public class FileUtil { public static void createFile(String pathstr) throws IOException{ String path = pathstr; StringTokenizer st = new StringTokenizer(path,"/"); String path1 = st.nextToken()+"/"; String path2 = path1; while(st.hasMoreTokens()) { path1 = st.nextToken()+"/"; path2 += path1; File inbox = new File(path2); if(!inbox.exists()) inbox.mkdir(); } } }
package 设计模式.代理模式; 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.JavaCompiler.CompilationTask; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; public class DynamicProxy { public static Object newProxyIntenct(Class infac,InvocationHandler h) throws Exception{ String br ="\r\n"; String methString =""; Method[] method = infac.getMethods(); for(Method m: method){ methString = " @Override"+ br + " public void "+m.getName()+"() {"+ br + " try {" + br + " Method md ="+ infac.getName()+".class.getMethod(\""+m.getName()+"\");"+ br + " h.invoke(this,md);" + br + " }catch (Exception e){ "+ br+ " e.printStackTrace();" + br + " }" + br + " }"; } String src = "package 设计模式.代理模式;" + br + "import java.lang.reflect.Method;" + br + "public class $DynamicProxy implements "+infac.getName()+"{" + br + " private 设计模式.代理模式.InvocationHandler h;" + br + " public $DynamicProxy(InvocationHandler h) {" + br + " super();" + br + " this.h = h;" + br + " }" + br + methString +br + "}"; FileUtil.createFile("D:/cache/eclipse-workspace/Test/src/设计模式/代理模式"); //生成java文件 String fileName ="D:\\cache\\eclipse-workspace\\Test\\src\\设计模式\\代理模式\\$DynamicProxy.java"; File file = new File(fileName); FileWriter fWriter = new FileWriter(file); fWriter.write(src); fWriter.flush(); fWriter.close(); //生成class文件,jdk6提供的工具类 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); //System.out.println(compiler.getClass().getName()); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); Iterable units = fileManager.getJavaFileObjects(fileName); CompilationTask task = compiler.getTask(null, fileManager, null, null, null, units); task.call(); fileManager.close(); //装载到内存,生成新对象 URL[] urls = new URL[]{new URL("file:/"+"D:\\cache\\eclipse-workspace\\Test\\src\\")}; URLClassLoader loader = new URLClassLoader(urls); Class c = loader.loadClass("设计模式.代理模式.$DynamicProxy"); //通过有参的构造器反射生成代理类的实例 Constructor ctr = c.getConstructor(InvocationHandler.class); Object obj = (Object) ctr.newInstance(h); return obj; } }
package 设计模式.代理模式; public class ProxyTest { public static void main(String[] args) throws Exception { Tank t = new Tank(); Moveable move = new TankTimeProxy(t); move.move(); System.out.println("--------------------------------"); Moveable move2 = (Moveable) DynamicProxy.newProxyIntenct(Moveable.class, new LogInvocationHandler(move)); move2.move(); } }
如果发现 有 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 空指针 错误
请 把 jdk 中的 tool.jar 拷贝一份 放到 jre 中
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
上一篇: 如何把maven项目打成jar包
下一篇: jdk动态代理
推荐阅读
-
设计模式之工厂模式(下篇)
-
JavaScript设计模式精华摘抄(持续更新...)-考拉阅读前端团队-SegmentFault思否
-
《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
-
js 设计模式——状态模式
-
Java设计中的Builder模式的介绍
-
c#设计模式之单例模式的实现方式
-
23种GoF设计模式概述
-
React组件设计模式之组合组件应用实例分析
-
Mybaits 源码解析 (十一)----- 设计模式精妙使用:静态代理和动态代理结合使用:@MapperScan将Mapper接口生成代理注入到Spring
-
设计模式之单例模式(懒汉式单例、饿汉式单例、登记式单例)