0
点赞
收藏
分享

微信扫一扫

cglib 动态代理


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>




举报

相关推荐

0 条评论