Cglib动态代理

Cglib动态代理

在开始之前需要导入包asm-2.2.3.jar 和 cglib-nodep.2.1_3jar
在这里可以免费下载http://download.csdn.net/detail/jarremdon/9624537
CGLIB是一个强大的高性能的代码生成包。他弥补了JDK动态代理的缺点就,没有接口也可以使用代理
那就是Cglib动态代理,但是自己有一个局限性,代理的类是可以继承的不能是final类,回顾代理模式
通常是通过接口或者子类继承父类的方式来实现一类加强另一个类

下面以具体的代码为例:

service类
package com.tang.CglibProxy;
public class service {
	public String services(){
		return "My name is JarremDon";
	}
}
代理类:CglibProxy
package com.tang.CglibProxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
	//需要代理的原始类
	public Object object;
	public CglibProxy(Object object){
		this.object=object;
	}
	public Object Proxy(){
		//创建加强器
		Enhancer enhancer=new Enhancer();
		//设置需要加强的类
		enhancer.setSuperclass(object.getClass());
		//设置回调
		enhancer.setCallback(this);
		enhancer.setClassLoader(object.getClass().getClassLoader());
		return enhancer.create();
	}
	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		//这里实现加强
		 Object invoke=arg3.invoke(object, arg2);
		return invoke.toString().toUpperCase();
	}
}


测试类:MyTest

package com.tang.CglibProxy;
public class MyTest {
	public 	static  void main(String args[]){
		service s=new service();
		CglibProxy proxy=new CglibProxy(s);
		service s1=(service) proxy.Proxy();
		System.out.println(s1.services());
	}
}


CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,
 但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,
 因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,
 由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值