?JDK动态代理需要使用接口实现,
如果目标对象没有实现接口,就需要使用CGLIB代理
?CGLIB代理使用的核心类Enhancer,在 CGLIB代理中设置代理对象以及设置回调函数
?CGLIB中代理类实现的接口与JDK代理对象不同
JDK代理 → InvocationHandler
CGLIB代理 →MethodInterceptor
下面呈现CGLIB代理实现的全部过程
※请手实测 转载请注明出处
①引包请参见「关于JDK动态代理执行过程」这篇文章
②创建目标类
package cglib;
public class UserOper {
	public void addUser() {
		System.out.println("执行addUser方法");
	}
	public void delUser() {
		System.out.println("执行delUser方法");
	}
}
③创建类及其相关方法
package cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import aspect.Myspect;
public class CglibProxy implements MethodInterceptor {
	/**
	 * 生成代理对象方法
	 * 
	 * @param targer
	 * @return 代理对象
	 */
	public Object createProxy(Object targer) {
		// 创建核心对象enhancer
		Enhancer enhancer = new Enhancer();
		// 确认增强类
		enhancer.setSuperclass(targer.getClass());
		// 设置回调函数
		enhancer.setCallback(this);
		return enhancer.create();
}
	/**
	 * 代理对象执行的方法
	 * 
	 * @param proxyObj
	 *            CGLIB父类生成的代理对象
	 * @param method
	 *            被拦截的 方法 本例指的是 addUser()和delUser()
	 * @param arg
	 *            参数
	 * @param methodProxy
	 *            方法的代理对象 执行父类的方法
	 * @return
	 */
	public Object intercept(Object proxyObj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
		// 创建切面类对象
		Myspect myspect = new Myspect();
		// 拦截前执行切面方法
		myspect.beforeExcute();
		// 目标方法的执行(重要)
		Object object = methodProxy.invokeSuper(proxyObj, arg);
		// 拦截后执行切面方法
		myspect.afterExcute();
		return object;
	}
}
④测试类
package cglib;
public class TestCglibProxy {
 public static void main(String[] args) {
		UserOper userOper = new UserOper();
		CglibProxy cglibProxy = new CglibProxy();
		UserOper userOperProxy = (UserOper) cglibProxy.createProxy(userOper);
		userOperProxy.addUser();
		userOperProxy.delUser();
	}
}
⑤运行结果
check
执行addUser方法
over
check
执行delUser方法
over
※请手实测 转载请注明出处
原文:https://www.cnblogs.com/dengw125792/p/11788490.html