cglib 动态代理

本文深入探讨了CGLIB包的底层原理,通过使用ASM(Java字节码操控框架),实现对字节码的转换与生成新类的功能。详细介绍了CGLIB包与ASM包之间的依赖关系,并提供了示例代码,展示了如何利用CGLIB进行AOP(面向切面编程)的实践。最后,阐述了CGLIB在实际开发中的应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架),来转换字节码并生成新的类。除了CGLIB包,脚本语言例如 Groovy和BeanShell,也是使用ASM来生成java的字节码。当不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。所以cglib包要依赖于asm包,需要一起导入。

 

代码:

package com.cglib;

public class UserDao {
	public void addUser() {
		System.out.println("addUser");
	}
}

package com.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 UserDaoCglib implements MethodInterceptor {
	private Object target;

	public Object getInstance(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("begin");
		proxy.invokeSuper(obj, args);
		System.out.println("end");
		return null;
	}

}

测试类:

package com.cglib;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UserDaoCglib cglib = new UserDaoCglib();
		UserDao userDao = (UserDao) cglib.getInstance(new UserDao());
		userDao.addUser();
	}

}

cglib的maven:

<dependency>
	<groupId>cglib</groupId>
	<artifactId>cglib</artifactId>
	<version>3.1</version>
</dependency>
            


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值