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


}

 

 

posted @ 2022-09-25 16:17  KwFruit  阅读(296)  评论(0编辑  收藏  举报