CGlib的动态代理使用示例

1、cglib简述

Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:

使用CGLIB需要导入以下两个jar文件:

$1: asm.jar – CGLIB的底层实现

$2: cglib.jar – CGLIB的核心jar包。

CGLIB的核心类:

net.sf.cglib.proxy.Enhancer –主要的增强类

net.sf.cglib.proxy.MethodInterceptor –主要的方法拦截类,它是Callback接口的子接口,需要用户实现

net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:

Object o = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。

2、简单的cglib代理使用

前述:Person 类和Dog类都有一个方法叫做avtive(); Dog的avtive()方法来实现自IAnimal接口。

package com.boonya.proxy.cglib;

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 CglibObjectProxy {

	@SuppressWarnings("rawtypes")
	public static Object ceateProxtObject(final Object object,Class clazz) {
		// 声明增加类实例
		Enhancer en = new Enhancer();
		// 设置被代理类字节码,CGLIB根据字节码生成被代理类的子类
		en.setSuperclass(clazz);
		// 设置回调函数,即一个方法拦截
		en.setCallback(new MethodInterceptor() {

			@Override
			public Object intercept(Object arg0, Method method, Object[] args,
					MethodProxy arg3) throws Throwable {
				
				// 注意参数object,仍然为外部声明的源对象,且Method为JDK的Method反射
				Object o = method.invoke(object, args);

				return o;
			}
		});
		return en.create();
	}
	
	public static void main(String[] args) {
		// 未实现接口的类的代理
		Person proxyPerson=(Person) CglibObjectProxy.ceateProxtObject(new Person(),Person.class);
		proxyPerson.active("Talk with sb.");
		// 实现接口的类的代理
		IAnimal proxyDog=(IAnimal) CglibObjectProxy.ceateProxtObject(new Dog(),Dog.class);
		proxyDog.active("Dog lying ...........");
		
	}

}
3、优化封装cglib的使用对象

package com.boonya.proxy.cglib;

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 {

	private Object srcTarget;

	private CglibProxy(Object o) {
		this.srcTarget = o;
	}

	@SuppressWarnings("unchecked")
	public static <T> T proxyTarget(T t) {
		Enhancer en = new Enhancer();
		en.setSuperclass(t.getClass());
		en.setCallback(new CglibProxy(t));
		T tt = (T) en.create();
		return tt;
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {

		Object o = method.invoke(srcTarget, args);
		return o;
	}

	public static void main(String[] args) {
		// 未实现接口的类的代理
		Person person = CglibProxy.proxyTarget(new Person());
		person.active("Tom speaking ........");
		// 实现接口的类的代理
		IAnimal dog = CglibProxy.proxyTarget(new Dog());
		dog.active("Dog is running.........");
	}

}

参考地址: http://www.open-open.com/lib/view/open1335662371030.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值