Spring 高级 cglib代理原理 MethodProxy
一、模拟cglib代理
package com.mangoubiubiu.show.a14; public class Target { public void save(){ System.out.println("save()"); } public void save(int i){ System.out.println("save(int)"); } public void save(long j){ System.out.println("save(long)"); } }
package com.mangoubiubiu.show.a14; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.lang.reflect.UndeclaredThrowableException; public class Proxy extends Target{ private MethodInterceptor interceptor; public void setInterceptor(MethodInterceptor interceptor) { this.interceptor = interceptor; } static Method save0; static Method save1; static Method save2; static MethodProxy save0Proxy; static MethodProxy save1Proxy; static MethodProxy save2Proxy; static { try { save0 = Target.class.getMethod("save"); save1 = Target.class.getMethod("save",int.class); save2 = Target.class.getMethod("save",long.class); //第一个参数 目标方法的类型 第二个参数 代理方法的类型 第三个参数 方法的参数 V 标识放回类型是void 第四个参数 第五个参数 save0Proxy = MethodProxy.create(Target.class,Proxy.class,"()V","save","saveSuper"); save1Proxy = MethodProxy.create(Target.class,Proxy.class,"(I)V","save","saveSuper"); //长整形的参数对象用J来表示 save2Proxy = MethodProxy.create(Target.class,Proxy.class,"(J)V","save","saveSuper"); } catch (NoSuchMethodException e) { throw new NoSuchMethodError(e.getMessage()); } } /** * 带原始功能的save */ public void saveSuper() { super.save(); } public void saveSuper(int i) { super.save(i); } public void saveSuper(long j) { super.save(j); } /** * 带增强功能的方法 */ @Override public void save() { try { interceptor.intercept(this,save0,new Object[0],save0Proxy); } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } @Override public void save(int i) { try { interceptor.intercept(this,save1,new Object[]{i},save1Proxy); } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } @Override public void save(long j) { try { interceptor.intercept(this,save2,new Object[]{j},save2Proxy); } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } }
package com.mangoubiubiu.show.a14; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.beans.XMLEncoder; import java.lang.reflect.Method; public class A14 { public static void main(String[] args) { Proxy proxy = new Proxy(); Target target = new Target(); proxy.setInterceptor((o, method, objects, methodProxy) -> { System.out.println("before"); // return method.invoke(target,objects);//反射调用 return methodProxy.invoke(target,objects);//内部无反射,结合目标用 }); proxy.save(); proxy.save(11); proxy.save(11l); } }