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

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

接口IFromService

package com.test.service;

public interface IFromService {

    public void removeService(long serviveid) throws Exception;

    public void modifyService(long serviveid)throws Exception; 

}

接口实现类 FromServieImpl

package com.test.service;

public class FromServieImpl implements IFromService{

    @Override
public void removeService(long serviveid) throws Exception {
// TODO Auto-generated method stub
System.out.println("模拟删除服务ID:"+serviveid);
Thread.currentThread().sleep(20);
} @Override
public void modifyService(long serviveid) throws Exception {
// TODO Auto-generated method stub
System.out.println("模拟修改服务ID:"+serviveid);
Thread.currentThread().sleep(40);
} /**
* 无接口实现类方法
* @param obj
* @throws InterruptedException
*/
public void addService(Object obj) throws InterruptedException{
System.out.println("模拟新增服务:"+obj);
Thread.currentThread().sleep(40);
} }

jdk代理类 FromServiceProxy

package com.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date; import com.test.utils.DateTimeUtil; /**
* jdk 动态代理
* @author Administrator
*
*/
public class FromServiceProxy implements InvocationHandler{
private Object target; /**
* 绑定委托类并返回代理类
* @param target
* @return
*/
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
} /**
* 调用
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result=null;
Date stdate=new Date();
System.out.println("监测 开始时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(stdate));
result=method.invoke(target, args);
Date eddate=new Date();
System.out.println("监测 结束时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(eddate));
System.out.println(method.getName()+" 执行耗时:"+(eddate.getTime()-stdate.getTime())+" ms"); return result;
} }

测试 TestProxy

package com.test.proxy;

import com.test.service.FromServieImpl;
import com.test.service.IFromService; public class TestProxy { public static void main(String[] args) throws Exception {
System.out.println("==============jdk proxy=================");
FromServiceProxy proxy=new FromServiceProxy();
IFromService service=(IFromService) proxy.bind(new FromServieImpl());
service.removeService(123);
service.modifyService(123);
}
}

输出如下:

==============jdk proxy=================
监测 开始时间:2016-03-24 13:25:48
模拟删除服务ID:123
监测 结束时间:2016-03-24 13:25:48
removeService 执行耗时:54 ms
监测 开始时间:2016-03-24 13:25:48
模拟修改服务ID:123
监测 结束时间:2016-03-24 13:25:48
modifyService 执行耗时:41 ms

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

cglib代理 FromServiceCglibProxy

package com.test.proxy;

import java.lang.reflect.Method;
import java.util.Date; import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; import com.test.utils.DateTimeUtil; /**
* cglib 动态代理
* @author Administrator
*
*/
public class FromServiceCglibProxy implements MethodInterceptor{ private Object target; /**
* 创建代理对象
* @param target
* @return
*/
public Object getInstance(Object target){
this.target=target;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.target.getClass());
enhancer.setCallback(this);
return enhancer.create();
} @Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Date stdate=new Date();
System.out.println("监测 开始时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(stdate));
proxy.invokeSuper(obj, args);
Date eddate=new Date();
System.out.println("监测 结束时间:"+DateTimeUtil.dateToStrOfDefaulfFormat(eddate));
System.out.println(method.getName()+" 执行耗时:"+(eddate.getTime()-stdate.getTime())+" ms");
return null;
} }

测试类 TestProxy

package com.test.proxy;

import com.test.service.FromServieImpl;
import com.test.service.IFromService; public class TestProxy { public static void main(String[] args) throws Exception { System.out.println("==============cglib proxy=================");
FromServiceCglibProxy cglib=new FromServiceCglibProxy();
FromServieImpl serviceImpl=(FromServieImpl) cglib.getInstance(new FromServieImpl());
serviceImpl.addService("entity");
}
}

输出如下:

==============cglib proxy=================
监测 开始时间:2016-03-24 13:25:48
模拟新增服务:entity
监测 结束时间:2016-03-24 13:25:48
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. InstallShield FEQ

    Q: 如何替换setup.exe的图标? A: 这不是一个推荐的操作,因为可能会引起不可预见的错误,而且IS没有开放这个接口.如果你坚持要这么做,可以使用第三方软件比如ExeScope来进行图标替换. ...

  2. GCC警告提示错误“cc1:all warnings being treated as errors”

    http://blog.csdn.net/zhangjs0322/article/details/25131787

  3. ISO7816协商模式和特定模式

    ISO7816协议的协商模式和特定模式好多使用者都搞不明白,还经常有客户电话询问,这里将其澄清一下: ISO7816协议的协商模式和特定模式由复位应答字节TA2确定,下面是TA2的字节定义 TA2的存 ...

  4. Python核心编程 练习

    2–9.循环和运算符 创建一个包含五个固定数值的列表或元组,输出他们的平均值.本练习的难点之一是通过除法得到平均值. 你会发现整数除会截去小数,因此你必须使用浮点除以得到更精确的结果. float() ...

  5. 关于unsigned int和int的加法

    补码(two's complement) 在计算机系统中,数值一律用补码来表示和存储.原因在于,使用补码,可以将符号位和数值域统一处理:同时,加法和减法也可以统一处理.此外,补码与原码相互转换,其运算 ...

  6. [Design Pattern] DAO Pattern 简单案例

    Data Access Object Pattern, or DAO Pattern, 即 DAO 模式,用于分离底层的数据访问接口,已经上层的业务逻辑. 下面是 Dao 模式的一个简单的案例. St ...

  7. Migration workstation vms to openstack kvm

    Migration workstation vms to openstack kvm 分别分成(磁盘是否拆分,vms 是否 有多个磁盘驱动器) 1, linux迁移 vmware workstatio ...

  8. ASP.NET 之深入浅出Session和Cookie

    在做人事档案管理系统中,对于Session和Cookie的使用后理解更加深刻了,下面对本知识点总结学习. Session是什么? 简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有 ...

  9. 深入理解jdk和jre(转)

    转自:http://ihyperwin.iteye.com/blog/1513754 大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做.因为这样更能帮助大家 ...

  10. QT5 TK1 串口通信

    对TK1中基于QT5的串口通信过程进行总结.按照软件安装及通信实现的顺序. 1.QT5安装 较简洁方式:打开软件中心(类似A形),搜索qtcreator,点击安装即可. 2.串口通信库安装 采用上述方 ...