CGLib动态代理

      由于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 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—



你可能感兴趣的:(代理,cglib)