cglib 实现动态代理

一、下载cglib的jar包

可以去这个地址下载 http://download.csdn.net/detail/jarremdon/9624537

二、 创建 实现类 实现  MethodInterceptor 接口代码如下:

package com.cglib.Proxy;


import java.lang.reflect.Method;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


/**
 * 实现原理cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,
 * 所以不能对final修饰的类进行代理。
 * 
 * @author 思 路
 * @time 2017年4月27日
 */
public class Cglib implements MethodInterceptor {
private Object object;


public Cglib(Object object) {
// TODO Auto-generated constructor stub
this.object = object;
}


public Object getProxy() {
// Enhance (增强版)
Enhancer enhancer = new Enhancer();
// 设置 父类 代理的类
enhancer.setSuperclass(object.getClass());
// 设置回调类为本类
enhancer.setCallback(this);
// 生成实现实现类
return enhancer.create();
}


@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println("注水前");
arg3.invokeSuper(arg0, arg2);
System.out.println("注水后边");
return null;
}


}

三、测试

为实现接口类

package com.cglib.Proxy;


/**
 * @author 思 路
 * @time 2017年4月27日
 */
public class Myself {


public Myself() {
// TODO Auto-generated constructor stub
}


public void say() {
System.out.println("我是我,不一样的烟火");
}


}

测试类

package com.cglib.Proxy;


import org.junit.Test;


/**
 * @author 思 路
 * @time 2017年4月27日
 */
public class CglibTest {


public CglibTest() {
// TODO Auto-generated constructor stub
}


@Test
public void test() {
Cglib cglib = new Cglib(new Myself());
Myself myself = (Myself) cglib.getProxy();
myself.say();
}


}

结果如下:

cglib 实现动态代理