jdk与cglib的动态代理
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的动态代理的更多相关文章
- JDK 和 CGLib 实现动态代理和区别
JDK 和 CGLib 实现动态代理和区别 在日常的开发中,Spring AOP 是一个非常常用的功能.谈到 AOP,自然离不开动态代理. 那么,基于 JDK 和 CGLib 如何实现动态代理,他们之 ...
- JDK和Cglib实现动态代理实例及优缺点分析
Spring AOP使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例如计算方法执行效率.打印 ...
- JDK和CGLIB生成动态代理类的区别
关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...
- 【4】JDK和CGLIB生成动态代理类的区别
当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:事先写好代理对象类,在 ...
- JDK和CGLIB生成动态代理类的区别(转)
关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...
- java面试题之spring aop中jdk和cglib哪个动态代理的性能更好?
在jdk6和jdk7的时候,jdk比cglib要慢: 在jdk8的时候,jdk性能得到提升比cglib要快很多: 结论出自:https://www.cnblogs.com/xuliugen/p/104 ...
- cglib实现动态代理简单使用
Boss: package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要 ...
- jdk自带的动态代理
package com.stone.dp.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Met ...
- 使用CGLIB实现动态代理
参考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments CGLIB动态代理 定义:CGLIB(code genaratio ...
随机推荐
- 疯狂java实战演义 弹球游戏代码
package org.crazyit.ball; import java.awt.Image; import java.io.File; import javax.imageio.ImageIO; ...
- HDOJ 2206 IP的计算(正则表达式的应用)
Problem Description 在网络课程上,我学到了很多有关IP的知识.IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方 ...
- Java连接MySQL中文乱码处理【转载】
本文转载地址:http://developer.51cto.com/art/200906/130425.htm 感谢相关作者! MySQL默认编码是latin1 mysql> show vari ...
- java的异常处理简介
异常概述 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等. 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生. 对于这些错误,一 ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover.c
遗传算法中的交叉操作是 对NSGA-II 源码分析的 最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的 函数模块. 这里,首先提一下,遗传算法的 交叉操作.变异操作都 ...
- Photography theory: a beginner's guide(telegraph.co.uk)
By Diane Smyth, Tim Clark, Rachel Segal Hamilton and Lewis Bush 11:00AM BST 09 Jun 2014 Have you r ...
- thead、tbody、tfoot与顺序无关
今天发现一个问题,thead.tbody.tfoot等标签的内容排版与顺序无关,做了一个小的实验:
- 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接
在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...
- 初次使用cocoapods注意事项
在仅仅用cocoapods时可能会遇到各种各样的错误和问题 这里中总结下: 1.首先使用cocoapods有非常多优点,在github上非常多优秀的开源项目都用到了它;假设你不会使用它,那么非常多优秀 ...
- struts2在web.xml中配置详情
web.xml是web应用中载入有关servlet信息的重要配置文件,起着初始化servlet,filter等web程序的作用. 通常,全部的MVC框架都须要Web应用载入一个核心控制器.那採取什么方 ...