java 动态代理(四)——动态代理(cglib)

       JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

cglib动态代理示例:

1、被代理类:CgLibClass

package test.proxy;

/**
 * cglib 被代理类
 * 
 * @author guweiqiang
 */
public class CgLibClass {

	public void testCglib(){
		System.out.println("testCglib...");
	}
}
 

2、cglib 代理类:CglibProxy

package test.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动态代理类
 * 
 * @author guweiqiang
 */
public class CglibProxy implements MethodInterceptor {
	private Object target; 
	
	/**
	 * 创建代理对象
	 */
	public Object getInstance(Object obj){
		this.target = obj;
		
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		// 回调函数
		enhancer.setCallback(this);
		// 返回代理对象
		return enhancer.create();
	}

	/**
	 * 回调方法
	 */
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("事物开始");  
		proxy.invokeSuper(obj, args);
		System.out.println("事物结束");  
		return null;
	}


}
 

3、cglib 测试类:CglibTest

package test.proxy;

/**
 * cglib 测试类
 * 
 * @author guweiqiang
 */
public class CglibTest {

	public static void main(String[] args) {
		CglibProxy proxy = new CglibProxy();
		CgLibClass cgLib = (CgLibClass) proxy.getInstance(new CgLibClass());
		cgLib.testCglib();
	}
}
 

运行结果:

事物开始
testCglib...
事物结束

 

猜你喜欢

转载自guwq2014.iteye.com/blog/2218714