cglib 代理

使用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

猜你喜欢

转载自blog.csdn.net/mnjlj_23nmk/article/details/51351785
今日推荐