`
leeo1124
  • 浏览: 23691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CGLib动态代理

    博客分类:
  • java
阅读更多
      由于JDK创建代理有一个限制,它只能为接口创建代理实例,那么对于没有通过接口定义业务方法的类,如何动态创建代理实例呢?显然CGLib是一个很好的选择,CGLib采有底层的字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用。下面就看一下CGLib如何实现动态代理吧。

1、代理目标类
/**
 * 代理目标类
 * @author Leeo
 *
 */
class Task {

	public Task() {

	}

	public void run() {
		System.out.println("hello...");
	}

}

2、实现动态代理
/**
 * 采用CGLIB实现动态代理
 * @author Leeo
 *
 */
class CglibProxy implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();

	@SuppressWarnings("unchecked")
	public Object getProxy(Class clazz) {
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("begin......" + obj.getClass().getName() + "."
				+ method.getName());
		// 通过代理类调用父类中的方法
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("end......");
		return result;
	}

}

3、代理测试
/**
 * CGLib 动态代理测试
 * @author Leeo
 *
 */
public class CglibProxyTest {


	public static void main(String[] args) {
		
		CglibProxy proxy = new CglibProxy();
		Task task = (Task) proxy.getProxy(Task.class);
		task.run();

	}

}
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics