代码使用了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. public static void before(){
  3. System.out.println("begin log...");
  4. }
  5. public static void after(){
  6. System.out.println("finish log...");
  7. }
  8. }

4 定义时间类

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

5 定义InvocationHander

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

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

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

java中的动态代理----自己手动实现相关推荐

  1. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  2. 使用 JAVA 中的动态代理实现数据库连接池

    数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共 ...

  3. Java中的动态代理详解

    前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  4. java动态代理_Java中的动态代理一

    方法newProxyInstance介绍 这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理.我们学习动态代理直接从学习一个方法开始,这个方法 ...

  5. java 委托_动态代理:Java开发必学

    一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...

  6. Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...

  7. Java se之动态代理

    转载自 Java se之动态代理 jdk动态代理: jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类: 通过Proxy的newProxyInstance()方法,参数 ...

  8. Java中如何实现代理机制(JDK、CGLIB)

    代理分为两种: 1.静态代理 2.动态代理  动态代理又分为两种:jdk 实现  :Cglib 实现 3.Java中如何实现代理机制(JDK.CGLIB) JDK动态代理:代理类和目标类实现了共同的接 ...

  9. 学习spring必须java基础知识-动态代理

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...

最新文章

  1. deepin V20 启用Nvidia驱动方法
  2. 推荐一个牛逼的 GitHub 项目+支付宝、微信支付项目实战!快来获取!
  3. Brad Wilson写的 ASP.NET MVC 3 Service Location 系列文章索引
  4. PHP3.2.3 where or,WHERE · ThinkPHP3.2.3完全开发手册 · 看云
  5. 调整了canvas的高度页面变化后还原_Web 页面录屏实现
  6. 第一个帖子吧,我也博客了!
  7. 语言速算24点的小窍门_生活百科,知道这25个实用的居家小窍门,可以为你省去不少麻烦...
  8. 4符号代码_ELF文件格式解析器 原理 + 代码
  9. 代码分享:JS判断登陆端是PC还是手机
  10. Hibernate插入、查询、删除操作 HQL (转)
  11. mysql sql语句 参数化_MySQL存储过程准备语句(动态SQL)参数化
  12. Android实现立体滚轮控件,Camera和Matrix实现真正的3D(WheelView)滚轮控件
  13. J2EE框架技术(SpringMVC) 知识点笔记(2)
  14. 神舟微型计算机系统重装步骤,神舟笔记本电脑重装系统步骤介绍【图解】
  15. 日记:2019新年计划,每日计划的思维导图
  16. 装修以后很快后悔的80件事
  17. 迎接互联网的明天--玩转3D Web
  18. 浏览器证书基础介绍和如何测试本地浏览器的HTTPS的完备性
  19. 吉首大学第八届“新星杯”题解AEGIJK
  20. 音乐播放器下载音乐需要收费

热门文章

  1. Linux下MPlayer的安装
  2. unicode 字符串转成 TDesC-转贴
  3. HierarchicalBeanFactory
  4. es6 --- set实现并集(Union)、交集(Intersect)和差集(Difference)
  5. 查看Oracle 版本信息
  6. 区块链教程Fabric1.0源代码分析流言算法Gossip服务端二
  7. WEB-INFO/lib build path 的jar包问题
  8. 计算UILabel带行间距的行高
  9. 给ADSL用户的忠告
  10. TCP/IP 通信示例