使用cglib 代理需要导入两个包(asm-3.3.1.jar、cglib-2.2.2.jar)导包的时候你要观察你导入这两个包是否兼容。
1飞机类:
package com.jxufe.cglibproxy;
/**
* 飞机类
* @author jack
* @version 创建时间:2016年5月9日 上午10:40:05
*
*/
public class Airplane {
public void fly(){
System.out.println("飞机正在飞行中。。。。。");
}
}
2.代理类:
package com.jxufe.cglibproxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 这是一个飞机的代理类(cgblib代理)
* @author jack
* @version 创建时间:2016年5月9日 上午10:43:45
*
*/
public class AirplaneCGLibProxy implements MethodInterceptor{
private Enhancer enhancer= new Enhancer();
/**
*
*@param clazz 被代理对象的类类型
*@return 被代理类的子类
*/
public Object getProxy(Class<?> clazz){
//设置需要子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类的实例
return enhancer.create();
}
/**
* param:arg0 被代理对象的实例
* param:arg1被代理对象的方法
* param:arg2 被代理对象的方法的参数
* param:arg3:代理类的实例
* return : 被代理对象方法返回的值
*/
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
beforeLogic();
//注意这是调用父类的放方法
Object result = arg3.invokeSuper(arg0, arg2);
afterLogic();
return result;
}
/**
* 被代理方法后执行的逻辑
*/
public void afterLogic(){
System.out.println("飞机停飞,飞行了2000km");
}
/**
* 被代理方法前执行的逻辑
*/
public void beforeLogic(){
System.out.println("飞机起飞。");
}
}
3.测试类:
package com.jxufe.cglibproxy;
public class CglibTest {
public static void main(String[] args) {
AirplaneCGLibProxy proxy = new AirplaneCGLibProxy();
Airplane craftplane = (Airplane) proxy.getProxy(Airplane.class);
craftplane.fly();
}
}
4.result:
飞机起飞。
飞机正在飞行中。。。。。
飞机停飞,飞行了2000km