在网上学习了马士兵老师的设计模式视屏,过程中也有认真的做相应的笔记。在次分享我的一些
成果,方便大家的进一步学习。

1、接口
  public interface Moveable { void move(); }

2、被代理的对象

 public class Tank implements Moveable {

     @Override
public void move() { System.out.println("Tank Moving...");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
} } }

3、测试主类

 public class Test {
public static void main(String[] args) throws Exception{
String rt = "\r\n"; //代理类的字符串代码
String src =
"public class TankTimeProxy implements Moveable {"+rt+
" Moveable t;"+rt+ " public TankTimeProxy(Moveable t) {"+rt+
" this.t = t;"+rt+
" }"+rt+ " @Override"+rt+
" public void move() {"+rt+
" long start = System.currentTimeMillis();"+rt+
" System.out.println(\"start time is \"+start);"+rt+
" t.move();"+rt+
" long end = System.currentTimeMillis();"+rt+
" System.out.println(\"end time is \"+end);"+rt+
" System.out.println(\"time is \"+(end - start));"+rt+
" }"+rt+
"}"; //将字符串写入java文件********************************************************************************
String fileName = System.getProperty("user.dir")+"/src/TankTimeProxy.java";//放置在(根目录+文件名)下
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
  //写入内容
fw.write(src);
fw.flush();
fw.close(); //进行编译********************************************************************************************
//首先获得编译器
//compiler 为java编译器 即javac
//获得编译器对象
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); //参数含义 (编译诊断,locale,charset)
//管理动态生成的文件的StandardJavaFileManager对象
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);//默认值 //根据参数获取多个java文件 返回java文件对象集
Iterable units = fileManager.getJavaFileObjects(fileName); //“编译任务”对象
JavaCompiler.CompilationTask task = compiler.getTask(null,fileManager,null,null,null,units);
task.call();//调用
fileManager.close(); //************以上过程获得了java文件源码,编译java文件生成了相对应的class文件**************** //***************以下过程为将class文件加载至内存,生成新对象*****************************
//Class.load() 是加载path路径的class文件
//URLClassLoader是将硬盘中的class文件加载进入 //通过Url引入本地文件
URL[] urls = new URL[]{new URL("file:/"+System.getProperty("user.dir")+"/out/production/proxy")}; //访问本地class文件,这里我用的是IntellijIDEA,默认   生成的class文件的目录在 /out/production/ 下 //去指定路径寻找class文件
URLClassLoader urlClassLoader = new URLClassLoader(urls); Class c = urlClassLoader.loadClass("TankTimeProxy"); System.out.println(c); //执行
//c.newInstance(); 是调用空的构造方法 //获得构造方法
//根据java虚拟机,每一个构造方法也相当于一个对象
Constructor constructor = c.getConstructor(Moveable.class); //产生新对象
Moveable m = (Moveable) constructor.newInstance(new Tank()); //new Tank()为构造方法的参数 即被代理对象 m.move(); }
}

4、执行结果

简单模拟java动态动态代理机制的底层实现原理的更多相关文章

  1. 《Java并发编程的艺术》Java并发机制的底层实现原理(二)

    Java并发机制的底层实现原理 1.volatile volatile相当于轻量级的synchronized,在并发编程中保证数据的可见性,使用 valotile 修饰的变量,其内存模型会增加一个 L ...

  2. 那些年读过的书《Java并发编程的艺术》一、并发编程的挑战和并发机制的底层实现原理

    一.并发编程的挑战 1.上下文切换 (1)上下文切换的问题 在处理器上提供了强大的并行性就使得程序的并发成为了可能.处理器通过给不同的线程分配不同的时间片以实现线程执行的自动调度和切换,实现了程序并行 ...

  3. 【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile

    章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译= ...

  4. Java 并发系列之二:java 并发机制的底层实现原理

    1. 处理器实现原子操作 2. volatile /** 补充: 主要作用:内存可见性,是变量在多个线程中可见,修饰变量,解决一写多读的问题. 轻量级的synchronized,不会造成阻塞.性能比s ...

  5. Java并发机制的底层实现原理之volatile应用,初学者误看!

    volatile的介绍: Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现 ...

  6. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  7. Java并发机制和底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行.Java中的并发机制依赖于JVM的实现和CPU的指令. Java语言规范第三版中 ...

  8. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

  9. Java面试必问之Hashmap底层实现原理(JDK1.7)

    1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...

随机推荐

  1. Css3 display用法

    display 属性规定元素应该生成的框的类型. display:none   此元素不会被显示 display:block   此元素将显示为块级元素,此元素前后会带有换行符 display:inl ...

  2. Android上实现仿IOS弹性ScrollView

    [转]http://www.tuicool.com/articles/ummIJb

  3. 7Zip 来备份重要文件(夹)

    body { font-family: 宋体,Georgia,Helvetica,Arial,sans-serif,宋体,serif; font-size: 10.5pt; line-height: ...

  4. java大数总结【转】

    java大数(2013长春网络赛)--hdu4762总结一下:1.java提交类要写Main.2.读取大数. Scanner read=new Scanner(System.in); BigInteg ...

  5. mysql 字符集设置查看

    1.列出MYSQL支持的所有字符集: SHOW CHARACTER SET; 2.当前MYSQL服务器字符集设置 SHOW VARIABLES LIKE 'character_set_%'; 3.当前 ...

  6. php中body下出现莫名空白字符

    php中body下出现莫名空白字符,出现原因 1. 模板前面有莫名格式空格,删不掉,必须把模板里面东西复制出来,新建一个文件弄进去,覆盖原有的 2.docutype前面出现代码,也会导致此问题(有可能 ...

  7. 学习笔记之SQL

    --------参考网站-------- http://en.wikipedia.org/wiki/SQL SQL@Wiki http://en.wikipedia.org/wiki/Delete_% ...

  8. 文件I/O(不带缓冲)之write函数

    调用write函数向打开的文件写数据. #include <unistd.h> ssize_t write( int filedes, const void *buf, size_t nb ...

  9. iOS简单加载一个网页

    .h文件中 @property(strong ,nonitomic) UIWebView * webView; .m文件中 -(void)viewDidLoad { self.webview = [[ ...

  10. Spring – ${} is not working in @Value--转载

    原文:http://www.mkyong.com/spring/spring-is-not-working-in-value/ By mkyong | February 4, 2015 | Last ...