cglib是一个强大的高性能的代码生成包,他广泛的被许多的AOP框架使用,例如Spring AOP 和dynaop ,为他们提供方法的拦截(interception),最流行的OR Mapping 工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联。在这里要说明的是,jdk提供了动态代理功能,但是被代理类必须要有接口,否则是生成不了代理的,但是cglib生成代理时,不需要目标类有接口,因为它借助了asm直接修改class文件的字节码。
就这个动态代理说开来,其实spring的aop不是什么神秘的东西,就是借助动态代理来实现的,并且spring内置了两种代理生成方式,一个就是jdk动态代理API,一个就是cglib。典型的spring组件如声明式的事务管理,通知等。spring的IOC更简单,根据配置文件反射而已。这些东西自己实现并不是什么难事,但是要做到spring那样完善和庞大就是另外一回事了。spring提供的测试框架的mock模块当然也是利用了动态代理的。
下面看看demo吧,具体可自行查阅cglib文档
①:创建一个简单的类,注意该类不能声明为final
QueryDAO.java
package com.cglib.proxy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @history
*/
public class QueryDAO {
@SuppressWarnings("unchecked")
public List executeQuery(String userName) throws Exception{
List list = this.queryForList(userName);
return list;
}
@SuppressWarnings({ "unchecked", "static-access" })
public List queryForList(String userName){
try {
Thread.currentThread().sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map<String,String> paramMap = new HashMap<String, String>();
paramMap.put("userName", userName);
List list = new ArrayList();
list.add(paramMap);
return list;
}
}
②:创建性能检测类PerformanceMonitor,需要实现MethodInterceptor(方法拦截)
PerformanceMonitor.java
package com.cglib.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @version 1.0
* @history
*/
public class PerformanceMonitor implements MethodInterceptor {
private Object target;
private Enhancer enhander = new Enhancer();
public Object createProxy(Object target){
this.target = target;
enhander.setSuperclass(target.getClass()); //指定父类
enhander.setCallback(this); //回调当前类
return enhander.create(); //创建代理类实例
}
public Object intercept(Object arg0, Method method, Object[] param,
MethodProxy proxyMethod) throws Throwable {
long startTime = System.currentTimeMillis(); //开始时间
Object result = method.invoke(this.target, param); //反射回调方法
long endTime = System.currentTimeMillis(); //结束时间
System.out.println("执行该方法所需时间:" + (endTime-startTime)+"毫秒" );
return result;
}
}
③:Cglib代理类测试效果:
CglibProxyTest.java
package com.cglib.proxy;
public class CglibProxyTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
QueryDAO target = new QueryDAO(); //声明被代理类
PerformanceMonitor performance = new PerformanceMonitor();
QueryDAO dao = (QueryDAO)performance.createProxy(target);
dao.executeQuery("admin");
}
}
输入结果
执行该方法所需时间:187毫秒
分享到:
相关推荐
java代理机制 JDK动态代理和cglib代理 详解
java动态代理和cglib动态代理示例分享共5页.pdf.zip
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
实现java动态代理的两个实例,jdk动态代理和cglib
NULL 博文链接:https://pluto418.iteye.com/blog/1692218
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
Java JDK代理、CGLIB、AspectJ代理分析比较
java静态代理 jdk动态代理 cglib动态代理 代理原理
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能
CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。
java动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdf
java动态代理(JDK和cglib)共10页.pdf.zip
Java的动态代理,包括JDK自带的和cglib所集成的。
在java编程使用CGLIB做动态代理时需要CGLIB依赖包支持,没有这个支持包,当导入import net.sf.cglib.proxy.Enhancer;或者import net.sf.cglib.proxy.MethodProxy;类似包时会提示错误,所以分享出来同大家共勉。
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
cglib和asm搭配的jar,方便你使用动态代理
Cglib动态代理技术对目标对象有没有实现接口,没有要求. Cglib动态代理技术,是通过拷贝然后修改目标对象的类的字节码来产生一个代理对象 而且这个Cglib产生的代理对象实例 是 目标对象的一个子类.
java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】 /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用...