1.jdk動態代理java
package com.yqg.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author yqg * @date 2019-02-18 22:04 */ public class JdkProxy implements InvocationHandler { private Object target; /** * 綁定業務對象,並返回一個代理類 */ public Object bind(Object target){ this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } /** * * @param proxy * @param method * @param args * @return * @throws Throwable */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("你好,小慶"); Object result = method.invoke(target,args); System.out.println("要好好學習喲"); return result; } }
@org.junit.Test public void JdkTest(){ People people = new QingGuo(); JdkProxy jdkProxy = new JdkProxy(); People qingguo = (People) jdkProxy.bind(people); qingguo.drink(); qingguo.eat(); }
2.cglib代理spring
package com.yqg.proxy; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @author yqg * @date 2019-02-18 22:05 */ public class CgLibProxy implements MethodInterceptor { private Object target; /** * * 綁定業務對象 */ public Object getInstance(Object target){ this.target = target; /** * 建立增長器,設置代理類的父類和回調方法 */ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); enhancer.setCallback(this); return enhancer.create(); } public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("cglib代理"); return methodProxy.invokeSuper(o,objects); } }
@org.junit.Test public void CglibTest(){ People people = new QingGuo(); CgLibProxy cgLibProxy = new CgLibProxy(); People p = (People) cgLibProxy.getInstance(people); p.eat(); p.drink(); }
3.二者區別框架
jdk動態代理使用反射機制,cglib使用的是字節碼機制,前者屬於java包,後者屬於spring 框架。學習