标签:
使用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
标签:
原文地址:http://blog.csdn.net/mnjlj_23nmk/article/details/51351785