java中的动态代理----自己手动实现

代码使用了common-io,需要其jar

1 接口

Java代码  收藏代码
  1. public interface Pruduct {  
  2.     void selling();  
  3. }  

 2 书籍类

Java代码  收藏代码
  1. public class Book implements Pruduct {  
  2.     @Override  
  3.     public void selling() {  
  4.         try {  
  5.             Thread.sleep(1000);  
  6.             System.out.println("books selling.....");  
  7.         } catch (InterruptedException e) {  
  8.             e.printStackTrace();  
  9.         }  
  10.     }  
  11. }  

 3 定义日志类

Java代码  收藏代码
  1. public class LogTranService{  
  2.   
  3.     public static void before(){  
  4.            
  5.         System.out.println("begin log...");  
  6.     }  
  7.   
  8.     public static void after(){  
  9.         System.out.println("finish log...");  
  10.     }  
  11.   
  12. }  

 4 定义时间类

Java代码  收藏代码
  1. public class TimeTranService {  
  2.     static long bgn;  
  3.   
  4.     public static void before(){  
  5.         bgn = System.currentTimeMillis();  
  6.         System.out.println("begin time...  " + bgn);  
  7.     }  
  8.     public static void after(){  
  9.         long end = System.currentTimeMillis();  
  10.         System.out.println("end time...  " + (end-bgn));  
  11.     }  
  12.   
  13. }  

 5 定义InvocationHander 

Java代码  收藏代码
  1. import java.lang.reflect.Method;  
  2.   
  3. public interface InvocationHander {  
  4.     public void invoke(Object o,Method m);  
  5. }  

 

Java代码  收藏代码
  1. import java.lang.reflect.Method;  
  2. public class ProxyHander implements InvocationHander {  
  3.   
  4.     private Object target;  
  5.     public ProxyHander(Object target) {  
  6.         this.target = target;  
  7.     }  
  8.     @Override  
  9.     public void invoke(Object o, Method m) {  
  10.         try {  
  11.             TimeTranService.before();  
  12.             LogTranService.before();  
  13.             m.invoke(target);  
  14.             LogTranService.after();  
  15.             TimeTranService.after();  
  16.         } catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         }   
  19.     }  
  20. }  

 6 代理类

Java代码  收藏代码
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. import java.lang.reflect.Constructor;  
  4. import java.lang.reflect.Method;  
  5.   
  6. import javax.tools.JavaCompiler;  
  7. import javax.tools.JavaCompiler.CompilationTask;  
  8. import javax.tools.StandardJavaFileManager;  
  9. import javax.tools.ToolProvider;  
  10.   
  11. import org.apache.commons.io.FileUtils;  
  12. public class Proxy {  
  13.     /* 
  14.      * 空的构造函数 
  15.      */  
  16.     private Proxy(){  
  17.     }  
  18.     /* 
  19.      * 返回代理类 
  20.      */  
  21.     public static Object newProxyInstance(Class inter,InvocationHander h){  
  22.         String proxyClassName = "$Proxy3";  
  23.         String packageName  = inter.getPackage().getName();  
  24.         String InHanderPackage = h.getClass().getPackage().getName();  
  25.         String rt = "\r\n";// 换行  
  26.         String methodCode = "";  
  27.         for (Method method:inter.getMethods()) {  
  28.             methodCode+="   @Override"+rt+  
  29.               
  30.             "   public void "+ method.getName()+"() {"+rt+  
  31.             "       try{"+rt+  
  32.             "           Method method  = "+inter.getName()+".class.getMethod(\""   
  33.             +           method.getName()+   "\");"+rt+  
  34.             "           h.invoke(this,method);      "+rt+  
  35.             "       }catch(Exception e ){" +rt+  
  36.             "           e.printStackTrace();" +rt+  
  37.             "       }"+rt+  
  38.             "   }";  
  39.         }  
  40.         /* 
  41.          * 总的java代码 
  42.          */  
  43.         String javaCode=    
  44.         "package  "+packageName+";"+rt+  
  45.         "import "+InHanderPackage+".InvocationHander;"+rt+  
  46.           
  47.         "import java.lang.reflect.Method;"+rt+  
  48.         "public class "+proxyClassName+" implements "+inter.getName()+" {"+rt+  
  49.         "   public "+proxyClassName+"("+InHanderPackage+".InvocationHander h) {"+rt+  
  50.         "       super();"+rt+  
  51.         "       this.h = h;"+rt+  
  52.         "   }"+rt+  
  53.         "   private "+InHanderPackage+".InvocationHander h;"+rt+  
  54.         methodCode+rt+  
  55.         "}";  
  56.         /* 
  57.          *  生成java文件 
  58.          */  
  59.         // 生成文件路径  
  60.         String filename =  System.getProperty("user.dir")+"/bin/"+packageName+"/"+proxyClassName+".java";  
  61.         File file = new File(filename);  
  62.         try {  
  63.             System.out.println(filename);  
  64.             FileUtils.writeStringToFile(file, javaCode);// commons-io这个框架可以放很方便的操作文件  
  65.         } catch (IOException e) {  
  66.             e.printStackTrace();  
  67.         }  
  68.           
  69.           
  70.         // 编译  拿到编译器  
  71.         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();  
  72.         // 文件管理  
  73.         StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);  
  74.         //获取文件  
  75.         Iterable units = fileMgr.getJavaFileObjects(filename);  
  76.           
  77.         // 编译任务  
  78.         CompilationTask t  = compiler.getTask(null, fileMgr, null, null, null, units);  
  79.         // call进行编译  
  80.         t.call();  
  81.         try {  
  82.             fileMgr.close();  
  83.         } catch (IOException e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.           
  87.         // load到内存  
  88.         ClassLoader cl = ClassLoader.getSystemClassLoader();  
  89.         try {  
  90.             Class c = cl.loadClass(packageName+"."+proxyClassName);  
  91.             Constructor ctr = c.getConstructor(InvocationHander.class);  
  92.             System.out.println("代理类的名字为:"+c.getName()+"===========");  
  93.             return ctr.newInstance(h);  
  94.         } catch (Exception e) {  
  95.             e.printStackTrace();  
  96.         }  
  97.         return null;  
  98.     }  
  99. }  

 7 测试

Java代码  收藏代码
  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.         Book book = new Book();  
  4.         InvocationHander h = new ProxyHander(book);  
  5.         Pruduct m = (Pruduct)Proxy.newProxyInstance(Pruduct.class,h);  
  6.         m.selling();  
  7.     }  
  8. }  

 

 

=============仅供参考============

转载于:https://www.cnblogs.com/xm1-ybtk/p/5099325.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Code Project精彩系列(1)

ApplicationsCrafting a C# forms Editor From scratchhttp://www.codeproject.com/csharp/SharpFormEditorDemo.asp建立一个类似C#的环境, 实现控件拖拉,属性Packet Capture and Analayzer网络封包截获http://www.codeproject.com/csharp/pacanal.aspA tool to cha…

linux进程---exec族函数(execl, execlp, execv, execvp, )解释和配合fork的使用

exec族函数函数的作用: exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何L…

Code Project精彩系列(2)

Windows FormsFireball Resourcer把各种资源嵌入应用程序资源Window Hiding with C#隐藏窗体, 似乎是其它运行的窗体 JProper Threading in Winforms .NETWindows Forms User Settings in C#使用VS设置设定forms, coolA Pretty Good Splash Screen in C#一个自绘可爱屏幕A curt…

python bool值要注意的一些地方

1、像(),[],{}这三个是可以通过bool(()),bool([]),bool({})转化为bool值的;且它们转化后的结果为False。但是这三个值它本身并不等于False、切记不可以与False 直接进行比较。 #!/usr/bin/python #!coding:utf-8 import sysif __name__ "__main__":falseL…

system函数和popen函数使用方法

system int system(const char *command);system()函数的返回值如下: 成功,则返回进程的状态值; 当sh不能执行时,返回127; 失败返回-1; 其实是封装后的exec,函数源代码在…

前端必备知识点—SVG

基本内容什么是SVG? 全称为Scalable Vector Graphics,是一种使用XML技术描述二维图形的语言,简单来说 - 矢量图(不失真)SVG与HTML5的关系早在HTML5之前,存在SVG技术SVG文件扩展名为".svg"在HTML5出现之前,要在HTML页面中引入SVG文件在HTML5出…

CocoaPods安装和使用及问题:Setting up CocoaPods master repo

CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他…

进程间的通信IPC(无名管道和命名管道)

进程间的通信IPC介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket…

那些关于浏览器的趣图和幽默段子

1、当浏览器化作一种枪,你喜欢用哪种呢?2、这神奇的反射弧,有点长…3、浏览器们成长的烦恼4、这么说来,IE浏览器扳回一分!5、如何用浏览器区分 HTML和 HTML56、都在吹牛,还是IE最务实!7、主流浏…

前端新手程序员不知道的 20个小技巧

1.作为前端开发者,使用双显示器能大幅提高开发效率。2.学编程最好的语言不是PHP,是English。3.东西交付之前偷偷测试一遍。4.问别人之前最好先自己百度,google一下,以免问出太低级的问题。5.把觉得不靠谱的需求放到最后做&#xf…

IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成

一、消息对列 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 特点: 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。消息队列独立于发送与接收进…

DBA十大必备工具(SQLServer)

曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过其他工具了;诚然,SSMS和Profile足够强大,工作的大部分内容都能通过它们搞定&…

linux 信号和信号量编程

对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrlc 来中断程序,会通过信号机制停止一个程序。 信号概述 信号的名字和编号&…

安卓动画基础讲解

//逐帧动画 /** * 1.加入单张图片 * 2.生成movie.xml整个图片 * 3.代码中使用图片movie.xml */ iv(ImageView) findViewById(R.id.iv);// iv.setImageResource(R.drawable.movie);//为iv加载六张图片// AnimationDrawable ad(AnimationDrawable) iv.getDrawable();//得到图片给…

JS一些常用的类库

一、返回上一页(history)发觉有两种用法:1、javascript:history.back(-1);2、javascript:history.go(-1);它们俩的区别是:history.back(-1):直接返回当前页的上一页,数据全部消息,返回新页面history.go(-1)…

Linux上线程开发API概要(线程)

进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。 进程是程序执行时的一个实例&…

Redis学习笔记1-Redis数据类型

Redis数据类型 Redis支持5种数据类型,它们描述如下: Strings - 字符串 字符串是 Redis 最基本的数据类型。Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串可以包含任意类型的数据,一个字符串最大为 512M 字节…

30个非常有趣的404错误页面设计欣赏

当用户访问一个不存在的页面的时候就会出现404错误页面,这对用户来说是很不友好的。所以很多网站都会去设计一个新颖的错误页面,以吸引用户继续浏览其它的网页内容。今天这篇文章就收集了30个非常有趣的404错误页面设计欣赏,希望能带给你灵感…

线程同步之互斥量加锁解锁 死锁

与互斥锁相关API 互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互…

游戏开发-从零开始 002

个人开发者的游戏大部分需要完成的内容: 1.完整的游戏玩法逻辑(核心) 2.UI 3.游戏关卡设计 4.游戏旁白 5.交互细节 6.游戏分享接口 7.游戏道具 8.游戏排行榜,游戏社区,如 GameCenter 9.游戏内购 如 remove Ads 10.广告…