CGLIB动态代理

概念

CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,

它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。

CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供

方法的interception(拦截)。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。

除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的字节码。当然不鼓励直接使用ASM,

因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

使用案例

package service;

/**
 * 被代理类
 */
public class CglibTest {

	public void test(){
		System.out.println("==测试CGLIB动态代理==");
	}
}

 

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * 拦截器
 */
import java.lang.reflect.Method;

public class MyInterceptor implements MethodInterceptor {

	private Object target;

	public MyInterceptor(Class clazz) {
		Enhancer enhancer = new Enhancer();
		// 设置需要创建的子类
		enhancer.setSuperclass(clazz);
		// 通过字节码技术动态创建子类实例
		enhancer.setCallback(this);
		this.target = enhancer.create();
	}

	public Object getTarget(){
		return target;
	}

	/**
	 *
	 * @param o 增强的对象
	 * @param method 被拦截的方法
	 * @param objects 被拦截方法的参数
	 * @param methodProxy 触发父类的方法对象
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
		System.out.println("事务开始。。。");
		Object result = methodProxy.invokeSuper(o, objects);
		System.out.println("事务结束。。。");
		return result;
	}
}

 

import service.CglibTest;

public class MyCglibTest {

	public static void main(String[] args) {
		// 创建代理对象
		MyInterceptor cglib = new MyInterceptor(CglibTest.class);

		CglibTest target = (CglibTest)cglib.getTarget();

		// 调用目标方法
		target.test();

	}
}

总结

自定义实现了MethodInterceptor接口的拦截器,重写intercept方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值