设计模式之_动态代理_03
我们假设被代理的对象实现了一个接口,不管它实现了什么样的接口,但是它实现了一个接口,用集成也可以实现代理,但是继承不好,所以我们被代理的类要实现一个接口,这个在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相关推荐
- 设计模式之_动态代理_06
package com.learn.proxy;public class Client {public static void main(String[] args) throws Exception ...
- 设计模式之_动态代理_05
package com.learn.proxy;public class Client {public static void main(String[] args) {Tank t = new Ta ...
- 设计模式之_动态代理_02
package com.learn.proxy;/*** JDK的那个类就叫Proxy* @author Leon.Sun**/ public class Proxy {/*** 这个方法就是用来产生 ...
- 设计模式之_动态代理_01
package com.learn.proxy;import java.util.Random;/*** 产生了坦克这么一个类* 坦克当然是可以移动的,实现了接口,实现了move方法* 我想知道一个方 ...
- 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库
文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...
- day19_java基础加强_动态代理+注解+类加载器
一.动态代理 1.1.代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一. 代理模式的定义: ...
- android中多态的应用_动态代理原理及在 Android 中的应用
code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:trampcr 链接:https://www.jianshu.com/p/492903ab2fae 声明:本文已 ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- 设计模式之----Java动态代理模式
在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...
最新文章
- matlab模型参数不匹配怎么办,修改Simulink模型后出现初始状态大小不匹配的错误...
- Tomcat的虚拟主机的配置
- SSD: how to optimize your Solid State Drive for Linux Mint 17.3, Ubuntu 16.04 and Debian
- P4318,bzoj2440-完全平方数【二分答案,莫比乌斯函数,容斥】
- jQuery 所有版本在线引用
- XP访问Linux共享错误提示
- IT行业学习网站汇总
- NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
- Ubuntu 16.04 使用 Libcoap
- 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...
- window10 pl2303驱动解决
- ipynb文件转py文件
- 金融科技大数据产品推荐:荣之联·风报—人工智能企业情报分析系统
- 联想thinkpad笔记本 蓝屏后设备管理器里面独立显卡突然消失了
- 苹果4s怎么越狱_iPhone11/iPhoneXs iOS13.3越狱来啦
- python数据评估
- 网络信息安全——访问控制
- 【DevOps】DevOps如何落地实施(二)
- MP4剪切合成时间计算
- 机器视觉应用于蔬果检测方面的相关英语词汇