代理模式——动态代理(自己写一个)
来源:互联网 发布:数控车床自动编程软件 编辑:程序博客网 时间:2024/05/22 16:52
思路
难点:proxy类,它的作用就是帮我们产生代理类。
- 将所有方法代码拼接成字符串。
- 将生成代理类的代码拼接成字符串(包含所有方法拼接成的字符串)。
- 将此字符串写入文件中、并使用JavaComplier对它进行编译。
- 将编译好的文件load进内存供我们使用,并返回代理实例。
Proxy代码:
public class Proxy { public static Object newProxyInstance(Class intefc, InvocationHandler handle) throws Exception { String rt = "\r\t" ; String methodStr = "" ; // first we should realize all the methods of the interface Method[] methods = intefc.getMethods(); for (Method m : methods) { methodStr +="public void "+m.getName()+"(){"+rt+ " try{"+rt+ " Method method = "+intefc.getName()+".class.getMethod(\""+m.getName()+"\");" + rt + " handle.invoke(this,method);" +rt+ " }catch(Exception ex){}" +rt+ "}" ; } String clazzStr = "package com.zdp.dynamicProxy;"+rt+ "import java.lang.reflect.Method;"+rt+ "public class $Proxy1 implements "+intefc.getName()+"{"+rt+ " private com.zdp.dynamicProxy.InvocationHandler handle ;"+rt+ " public $Proxy1(InvocationHandler handle){"+rt+ " this.handle=handle;"+rt+ " }"+rt+ " @Override"+rt+ methodStr +rt+ "}"; // write to a java file String uri = "D:/develop_environment/babasport/homework/src/com/zdp/dynamicProxy/$Proxy1.java"; File file = new File(uri) ; FileWriter writer = null ; try { writer = new FileWriter(file); writer.write(clazzStr) ; writer.flush() ; } catch (IOException e) { e.printStackTrace(); }finally{ try { if(writer !=null){ writer.close() ; } } catch (IOException e) { e.printStackTrace(); } } //load the java file, and then create an instance String url="D:/develop_environment/babasport/homework/src/"; URL[] urls = new URL[] {new URL("file:/" + url)}; URLClassLoader urlLoader = new URLClassLoader(urls); Class c = urlLoader.loadClass("com.zdp.dynamicProxy.$Proxy1"); //return the proxy instance Constructor ctr = c.getConstructor(InvocationHandler.class); Object proxyInstance = ctr.newInstance(handle); return proxyInstance; } }
阅读全文
0 0
- 代理模式——动态代理(自己写一个)
- 代理模式—动态代理
- 继承?静态代理?写一个自己的动态代理吧
- 代理模式(静态代理+动态代理)——JAVA
- 代理模式——静态代理、动态代理、cglib代理
- 设计模式之——代理模式(动态代理)
- 设计模式: 自己手动写一个代理模式
- 代理模式——动态代理
- 代理模式——动态代理
- 代理模式——动态代理
- 代理模式——动态代理
- java代理模式——动态代理
- 代理模式——动态代理
- 设计模式之禅——代理模式(一)普通代理&强制代理&虚拟代理&动态代理
- 代理模式——动态代理(实例)
- Java设计模式——代理模式(静态代理vs动态代理)
- 代理模式--动态代理
- 代理模式 & 动态代理
- namespace element 'annotation-config' and its parser class are only available on JDK 1.5 and higher
- TCP报文首部URG和PSH的区别
- linux生存指南:用户管理
- Vue2 (1)组件化
- 美团CodeM 初赛 A伦 最长树链 xjb枚举+dfs
- 代理模式——动态代理(自己写一个)
- android 设置(Settings)常见修改记录
- yield的表达式形式
- [笔记]: 网络流
- Python基本函数
- iOS开发之App Extension(应用扩展)之 -- Today Extension
- redis知识总结
- C++把多个char*合并为一个const char*
- Tkinter Label 文本的多行显示