JDK动态代理中包含一个类和一个接口: 
InvocationHandler接口: 
public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

参数说明: 
Object proxy:指被代理的对象。 
Method method:要调用的方法 
Object[] args:方法调用时所需要的参数

接口IFromService

  1. package com.test.service;
  2.  
  3. public interface IFromService {
  4.  
  5. public void removeService(long serviveid) throws Exception;
  6.  
  7. public void modifyService(long serviveid)throws Exception;
  8.  
  9. }

接口实现类 FromServieImpl

  1. package com.test.service;
  2.  
  3. public class FromServieImpl implements IFromService{
  4.  
  5. @Override
  6. public void removeService(long serviveid) throws Exception {
  7. // TODO Auto-generated method stub
  8. System.out.println("模拟删除服务ID:"+serviveid);
  9. Thread.currentThread().sleep(20);
  10. }
  11.  
  12. @Override
  13. public void modifyService(long serviveid) throws Exception {
  14. // TODO Auto-generated method stub
  15. System.out.println("模拟修改服务ID:"+serviveid);
  16. Thread.currentThread().sleep(40);
  17. }
  18.  
  19. /**
  20. * 无接口实现类方法
  21. * @param obj
  22. * @throws InterruptedException
  23. */
  24. public void addService(Object obj) throws InterruptedException{
  25. System.out.println("模拟新增服务:"+obj);
  26. Thread.currentThread().sleep(40);
  27. }
  28.  
  29. }

jdk代理类 FromServiceProxy

  1. package com.test.proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. import java.util.Date;
  7.  
  8. import com.test.utils.DateTimeUtil;
  9.  
  10. /**
  11. * jdk 动态代理
  12. * @author Administrator
  13. *
  14. */
  15. public class FromServiceProxy implements InvocationHandler{
  16. private Object target;
  17.  
  18. /**
  19. * 绑定委托类并返回代理类
  20. * @param target
  21. * @return
  22. */
  23. public Object bind(Object target){
  24. this.target=target;
  25. return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
  26. }
  27.  
  28. /**
  29. * 调用
  30. */
  31. @Override
  32. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  33. // TODO Auto-generated method stub
  34. Object result=null;
  35. Date stdate=new Date();
  36. System.out.println("监测 开始时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(stdate));
  37. result=method.invoke(target, args);
  38. Date eddate=new Date();
  39. System.out.println("监测 结束时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(eddate));
  40. System.out.println(method.getName()+" 执行耗时:"+(eddate.getTime()-stdate.getTime())+" ms");
  41.  
  42. return result;
  43. }
  44.  
  45. }

测试 TestProxy

  1. package com.test.proxy;
  2.  
  3. import com.test.service.FromServieImpl;
  4. import com.test.service.IFromService;
  5.  
  6. public class TestProxy {
  7.  
  8. public static void main(String[] args) throws Exception {
  9. System.out.println("==============jdk proxy=================");
  10. FromServiceProxy proxy=new FromServiceProxy();
  11. IFromService service=(IFromService) proxy.bind(new FromServieImpl());
  12. service.removeService(123);
  13. service.modifyService(123);
  14. }
  15. }

输出如下:

  1. ==============jdk proxy=================
  2. 监测 开始时间:2016-03-24 13:25:48
  3. 模拟删除服务ID123
  4. 监测 结束时间:2016-03-24 13:25:48
  5. removeService 执行耗时:54 ms
  6. 监测 开始时间:2016-03-24 13:25:48
  7. 模拟修改服务ID123
  8. 监测 结束时间:2016-03-24 13:25:48
  9. modifyService 执行耗时:41 ms

Cglib动态代理 
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

cglib代理 FromServiceCglibProxy

  1. package com.test.proxy;
  2.  
  3. import java.lang.reflect.Method;
  4. import java.util.Date;
  5.  
  6. import org.springframework.cglib.proxy.Enhancer;
  7. import org.springframework.cglib.proxy.MethodInterceptor;
  8. import org.springframework.cglib.proxy.MethodProxy;
  9.  
  10. import com.test.utils.DateTimeUtil;
  11.  
  12. /**
  13. * cglib 动态代理
  14. * @author Administrator
  15. *
  16. */
  17. public class FromServiceCglibProxy implements MethodInterceptor{
  18.  
  19. private Object target;
  20.  
  21. /**
  22. * 创建代理对象
  23. * @param target
  24. * @return
  25. */
  26. public Object getInstance(Object target){
  27. this.target=target;
  28. Enhancer enhancer=new Enhancer();
  29. enhancer.setSuperclass(this.target.getClass());
  30. enhancer.setCallback(this);
  31. return enhancer.create();
  32. }
  33.  
  34. @Override
  35. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  36. Date stdate=new Date();
  37. System.out.println("监测 开始时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(stdate));
  38. proxy.invokeSuper(obj, args);
  39. Date eddate=new Date();
  40. System.out.println("监测 结束时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(eddate));
  41. System.out.println(method.getName()+" 执行耗时:"+(eddate.getTime()-stdate.getTime())+" ms");
  42. return null;
  43. }
  44.  
  45. }

测试类 TestProxy

  1. package com.test.proxy;
  2.  
  3. import com.test.service.FromServieImpl;
  4. import com.test.service.IFromService;
  5.  
  6. public class TestProxy {
  7.  
  8. public static void main(String[] args) throws Exception {
  9.  
  10. System.out.println("==============cglib proxy=================");
  11. FromServiceCglibProxy cglib=new FromServiceCglibProxy();
  12. FromServieImpl serviceImpl=(FromServieImpl) cglib.getInstance(new FromServieImpl());
  13. serviceImpl.addService("entity");
  14. }
  15. }

输出如下:

  1. ==============cglib proxy=================
  2. 监测 开始时间:2016-03-24 13:25:48
  3. 模拟新增服务:entity
  4. 监测 结束时间:2016-03-24 13:25:48
  5. addService 执行耗时:65 ms

jdk与cglib的动态代理的更多相关文章

  1. JDK 和 CGLib 实现动态代理和区别

    JDK 和 CGLib 实现动态代理和区别 在日常的开发中,Spring AOP 是一个非常常用的功能.谈到 AOP,自然离不开动态代理. 那么,基于 JDK 和 CGLib 如何实现动态代理,他们之 ...

  2. JDK和Cglib实现动态代理实例及优缺点分析

    Spring AOP使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例如计算方法执行效率.打印 ...

  3. JDK和CGLIB生成动态代理类的区别

     关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...

  4. 【4】JDK和CGLIB生成动态代理类的区别

    当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:事先写好代理对象类,在 ...

  5. JDK和CGLIB生成动态代理类的区别(转)

     关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...

  6. java面试题之spring aop中jdk和cglib哪个动态代理的性能更好?

    在jdk6和jdk7的时候,jdk比cglib要慢: 在jdk8的时候,jdk性能得到提升比cglib要快很多: 结论出自:https://www.cnblogs.com/xuliugen/p/104 ...

  7. cglib实现动态代理简单使用

    Boss: package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要 ...

  8. jdk自带的动态代理

    package com.stone.dp.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Met ...

  9. 使用CGLIB实现动态代理

    参考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments CGLIB动态代理 定义:CGLIB(code genaratio ...

随机推荐

  1. Android 介绍spydroid每个包的大体功能

    看了接近一周的spydroid源代码,对spydroid这个开源项目有了一定的认识.也许有些理解不一定正确,给后来者一点启示.也是自己对rtsp协议,rtp协议的总结. 在windows下,如果安装了 ...

  2. 读undo问题

    SQL> drop table test1 purge; Table dropped. SQL> create table test1 as select * from dba_objec ...

  3. Android Studio开发环境部署

    Step0:背景,那些年-- Step1:安装JDK Step2:安装Android Studio 其他问题1:安装Android Studio之前没有先安装JDK 其他问题2:No JVM inst ...

  4. [Java] 类的初始化步骤

    前言 类的初始化过程,可在多线程环境下进行的,为了简化,本文介绍的单线程情况下的类初始化步骤. 此外,继承情况下的顺序不是本文焦点,本文重点在于一个类的内部字段的初始化顺序.想了解继承情况下的初始化情 ...

  5. libvirt 基于C API基本使用案例

    玩开源分享,需要有干到底的精神,今晚随便逛逛技术论坛突发有感;Ruiy不足之处,需跟进了; 最近变的较懒了,干活有点没劲,也不怪干来干去收获不大,缺少鼓励! 现在玩的技术大多是上不了台面了,想过没,你 ...

  6. Selenium webdriver 高级应用

    对于这一段还蛮有感慨的,只想说,代码还是需要自己去敲的. 1. 改变用户代理 import org.junit.AfterClass; import org.junit.BeforeClass; im ...

  7. F - Warm up - hdu 4612(缩点+求树的直径)

    题意:有一个无向连通图,现在问添加一条边后最少还有几个桥 分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下 *********************** ...

  8. python_Opencv_使用Matplotlib模块

    使用Matplotlib模块 Matplotib 是python 的一个绘图库,里头有各种各样的绘图方法. 之后会陆续了解.先学习怎样用Matplotib 显示图像. 可以放大图像,保存图像. 安装M ...

  9. Android Dialog AlertDialog

    1.普通的对话框 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...

  10. Oracle常用脚本——通过RMAN配置RAC环境的分布式磁带机

    RAC的两个节点:node1,node2 RAC的两个实例:dbrac1,dbrac2 用户,密码的东西大家看看就懂了.设置成8能通道的. #!/bin/bash rman target / < ...