各种设计模式DEMO,完善中...

来源:互联网 发布:北京软件开发学校 编辑:程序博客网 时间:2024/06/05 09:23

coding链接

https://coding.net/u/duchao123/p/designPattern/git/tree/master/factoryDemo/src/com

目前写出的有:单例模式、工厂模式、装饰器、适配器、模板方法、代理模式。其余会不断完善…

JDK动态代理代码片段

package com.proxy.demo.imitateJDKProxyDemo;import java.io.File;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.CompilationTask;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;import org.apache.commons.io.FileUtils;/** * 模拟JDK实现动态代理 * @author asa * */public class Proxy {    public static Object newProxyInstance(Class infce,InvocationHandler h) throws Exception{        String rt = "\r\n";        String method = "";        for(Method m : infce.getMethods()){            method +=             "   @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){" + rt +            "           e.printStackTrace();" + rt +            "       }" + rt +            "   }";        }         String str =            "package com.proxy.demo.imitateJDKProxyDemo;"+ rt +            "import com.proxy.demo.Food;"+ rt +            "import java.lang.reflect.Method;"+ rt +            "import com.proxy.demo.imitateJDKProxyDemo.InvocationHandler;"+ rt +            "public class $Proxy0 implements " + infce.getName() + "{"+ rt +            "   private InvocationHandler h;" + rt +            "   public $Proxy0(InvocationHandler h) {"+ rt +            "       super();"+ rt +            "       this.h = h;"+ rt +            "   }"+ rt + method + rt +            "}";        // 产生代理类的Java文件        String filename = System.getProperty("user.dir")+"\\bin\\com\\proxy\\demo\\imitateJDKProxyDemo\\$Proxy0.java";        System.out.println(filename);        File file = new File(filename);        // 抛出IOException        FileUtils.writeStringToFile(file, str);        // 得到当前系统的编译器        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();        // 文件管理者        StandardJavaFileManager fileMag = compiler.getStandardFileManager(null, null, null);        // 获取文件        Iterable iterable = fileMag.getJavaFileObjects(filename);        // 编译任务        CompilationTask task = compiler.getTask(null, fileMag, null, null, null, iterable);        // 进行编译        task.call();        fileMag.close();        // 得到类加载器 load到内存中        ClassLoader cls = ClassLoader.getSystemClassLoader();        Class cs = cls.loadClass("com.proxy.demo.imitateJDKProxyDemo.$Proxy0");        System.out.println(cs.getName());        Constructor ct = cs.getConstructor(InvocationHandler.class);        return ct.newInstance(h);     }}

我的QQ

原创粉丝点击