Spring 高级 cglib代理原理
一、模拟cglib代理
package com.mangoubiubiu.show.a14; import org.springframework.cglib.proxy.MethodInterceptor; 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 { try { save0 = Target.class.getMethod("save"); save1 = Target.class.getMethod("save",int.class); save2 = Target.class.getMethod("save",long.class); } catch (NoSuchMethodException e) { throw new NoSuchMethodError(e.getMessage()); } } @Override public void save() { try { interceptor.intercept(this,save0,new Object[0],null); } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } @Override public void save(int i) { try { interceptor.intercept(this,save1,new Object[]{i},null); } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } @Override public void save(long j) { try { interceptor.intercept(this,save2,new Object[]{j},null); } catch (Throwable e) { throw new UndeclaredThrowableException(e); } } }
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.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); }); proxy.save(); proxy.save(11); proxy.save(11l); } }