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);
    }


}

 

 

posted @ 2022-09-25 15:47  KwFruit  阅读(68)  评论(0编辑  收藏  举报