我们假设被代理的对象实现了一个接口,不管它实现了什么样的接口,但是它实现了一个接口,用集成也可以实现代理,但是继承不好,所以我们被代理的类要实现一个接口,这个在Spring也是这么要求的,不过Spring也提供了另外一种方式,你可以不实现接口,也能给你做成一个代理,这是Spring不推荐的,Spring能实现但是不推荐这样用AOP是动态代理的一种应用,我们可以用任何的对象任何的类,我怎么样给他生成这个代理呢,为了模拟JDK的实现,这个类叫做Proxy.
package com.learn.proxy;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;/*** 至少你要知道可以动态的生成类的* 你生成类还不行,你还需要load到内存* load到内存然后在生成他的一个对象,这个时候就需要用到反射了* @author Leon.Sun**/
public class Test1 {public static void main(String[] args) throws IOException {String rt = "\r\n";String src = "package com.learn.proxy;" +"public class TankTimeProxy implements Moveable {" + rt +"public TankTimeProxy(Moveable t) {" + rt +"super();" + rt +"this.t = t;" + rt +"}" + rt +"Moveable t;" + rt +"@Override " + rt +"public void move() {" + rt +"long start = System.currentTimeMillis();" + rt +"System.out.println(\"starttime:\" + start);" + rt +"t.move();" + rt +"long end = System.currentTimeMillis();" + rt +"System.out.println(\"time:\" + (end-start));" + rt +"}" +  rt +   "}";// System.out.println(System.getProperty("user.dir"));String fileName = System.getProperty("user.dir") + "/src/com/learn/proxy/TankTimeProxy.java";File f = new File(fileName);FileWriter fw = new FileWriter(f);fw.write(src);fw.flush();fw.close();/*** 这两个类来自javax.tools包,在API文档里面有* 这句话相当于我们拿到编译器了,可是SUN对于编译器的设计呢,很不直观,* 首先我们拿到编译对象*/JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();/*** com.sun.tools.javac.api.JavacTool, JDK自带的*/// System.out.println(compiler.getClass().getName());/*** 首先需要一个FileManager,File的管理者* 这里里面有三个参数* diagnosticListener诊断的监听器,就是你编译的期间有什么错误,由他来监听和收集* locale就是和国际化相关的,charset和国际化相关的,我们直接写null* 就会使用默认的语言JDK,拿到这个FileManager之后呢* * 做一个FileManager,这个FileManager管理着我们的这些文件*/StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);/*** 根据文件的名字他就可以拿到一系列的JavaFile,注意它是getJavaFileObjects,* 也就是你里面可以写多个名字,也就是现在通过FileManager,我可以找到这个文件了* 把这个对象放到Iterable对象里面,Iterable简单的理解就是一个数组就完了,* 可以用它来进行迭代* * 这个文件就是动态生成的文件*/Iterable units = fileManager.getJavaFileObjects(fileName);/*** 一次编译任务可以编译好多文件* out 你给他输出到哪里去 这个我们不管 写null* 第二个参数是FileManager是谁,因为你编译的时候要通过FileManager来找文件* diagnosticListener 第三个是监听器,* options你编译的时候指定的参数 先写null* classes 是null不管,就是你用到的class文件* units 是我们要编译哪些文件* 这个接口用起来很复杂,今天这个东西并不是我们的重点,* 总而言之我们通过这个方法getTask可以拿到CompilationTask,* 也就是编译的任务,我终于可以让他编译了* * 接下来我们根据FileManager我们编译的内容,我们生成一个CompilationTask* */CompilationTask t = compiler.getTask(null, fileManager, null, null, null, units);/*** 有了这个任务以后,我们call()调用这个任务就能完成了* * 调用call就编译一大堆的内容*/t.call();/*** 能不能编译完成呢*/fileManager.close();}}

设计模式之_动态代理_03相关推荐

  1. 设计模式之_动态代理_06

    package com.learn.proxy;public class Client {public static void main(String[] args) throws Exception ...

  2. 设计模式之_动态代理_05

    package com.learn.proxy;public class Client {public static void main(String[] args) {Tank t = new Ta ...

  3. 设计模式之_动态代理_02

    package com.learn.proxy;/*** JDK的那个类就叫Proxy* @author Leon.Sun**/ public class Proxy {/*** 这个方法就是用来产生 ...

  4. 设计模式之_动态代理_01

    package com.learn.proxy;import java.util.Random;/*** 产生了坦克这么一个类* 坦克当然是可以移动的,实现了接口,实现了move方法* 我想知道一个方 ...

  5. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  6. day19_java基础加强_动态代理+注解+类加载器

    一.动态代理 1.1.代理模式     什么是代理模式及其作用?         Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一.         代理模式的定义: ...

  7. android中多态的应用_动态代理原理及在 Android 中的应用

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:trampcr 链接:https://www.jianshu.com/p/492903ab2fae 声明:本文已 ...

  8. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  9. 设计模式之----Java动态代理模式

    在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...

最新文章

  1. matlab模型参数不匹配怎么办,修改Simulink模型后出现初始状态大小不匹配的错误...
  2. Tomcat的虚拟主机的配置
  3. SSD: how to optimize your Solid State Drive for Linux Mint 17.3, Ubuntu 16.04 and Debian
  4. P4318,bzoj2440-完全平方数【二分答案,莫比乌斯函数,容斥】
  5. jQuery 所有版本在线引用
  6. XP访问Linux共享错误提示
  7. IT行业学习网站汇总
  8. NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
  9. Ubuntu 16.04 使用 Libcoap
  10. 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...
  11. window10 pl2303驱动解决
  12. ipynb文件转py文件
  13. 金融科技大数据产品推荐:荣之联·风报—人工智能企业情报分析系统
  14. 联想thinkpad笔记本 蓝屏后设备管理器里面独立显卡突然消失了
  15. 苹果4s怎么越狱_iPhone11/iPhoneXs iOS13.3越狱来啦
  16. python数据评估
  17. 网络信息安全——访问控制
  18. 【DevOps】DevOps如何落地实施(二)
  19. MP4剪切合成时间计算
  20. 机器视觉应用于蔬果检测方面的相关英语词汇

热门文章

  1. 正式软件工作第一天————MVC、ext JS、和clsa
  2. 实现flex LinkBar 组件 动态切换ico图标
  3. Java内存管理:深入Java内存区域
  4. django学习资料网址汇总
  5. Servlet 和Filter的生命周期
  6. js浏览器窗口大小改变时事件
  7. 网站外链数量的变化可以从哪几点去理解
  8. MRJob 极速入门教程,使用Python玩转Hadoop
  9. xshell6保持连接_使用Xshell6+Xftp6连接Linux云服务器(图文教程)
  10. Nginx负载均衡策略之轮询与加权轮询