仿写Dubbo-Java代理

概念

代理是一种设计模式。使用代理对象替换真实对象,实现不修改真实对象的前提下对其进行额外操作,对其进行扩展。spring中的aop就是使用代理实现的。

静态代理

静态代理中的 真实对象和代理对象都需要实现同一个接口。对真实对象每个方法进行单独增强。

创建接口

public interface Action {
    void doSomething(String param);
}

创建代理类

public class StaticProxy implements Action {
    private Action object;

    public StaticProxy(Action object) {
        this.object = object;
    }

    @Override
    public void doSomething(String param) {
        System.out.println("before");
        object.doSomething(param);
        System.out.println("after");
    }
}

创建普通类

public class App implements Action {

    @Override
    public void doSomething(String param) {
        System.out.println(param);
    }

    public static void main(String[] args) {
        //创建代理对象
        StaticProxy proxy = new StaticProxy(new App());
        proxy.doSomething("hi");
    }
}
//    执行结果
/*    before
      hi
      after    */

JDK动态代理

与静态代理相比,JDK动态代理更加灵活。它的核心是 InvocationHandler接口和 Proxy类。使用Proxy类的newProxyInstance方法获取实例,newProxyInstance的三个参数分别是类加载器,被代理类实现的接口和实现InvocationHandler的代理类。JDK动态代理只能代理实现了接口的类。

创建接口

public interface Action {
    void doSomething(String param);
}

创建代理类

public class JDKProxy implements InvocationHandler {
    //要代理的对象
    private Object object;

    public JDKProxy(Object object) {
        this.object = object;
    }

    //获取实例
    public static Object getInstance(Object object) {
        JDKProxy handler = new JDKProxy(object);
        Object instance = Proxy.newProxyInstance(
                object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),
                handler);
        return instance;
    }

    //执行目标方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object invoke = method.invoke(object, args);
        System.out.println("after");
        return invoke;
    }
}

创建普通类

public class App implements Action {

    @Override
    public void doSomething(String param) {
        System.out.println(param);
    }

    public static void main(String[] args) {
        Action action = (Action) JDKProxy.getInstance(new App());
        action.doSomething("hi");
    }
}
//    执行结果
/*    before
      hi
      after    */

CGLIB动态代理

与JDK动态代理相比,CGLIB动态代理可以直接代理类,类不需要实现接口。CGLIB动态代理的核心是 MethodInterceptor接口与 Enhancer类。CGLIB动态代理需要引入依赖

创建代理类

public class CGLibProxy implements MethodInterceptor {
    public static Object getInstance(Class clazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setClassLoader(clazz.getClassLoader());
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(new CGLibProxy());
        Object result = enhancer.create();
        return result;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("after");
        return result;
    }
}

创建普通类

public class App {

    public void doSomething(String param) {
        System.out.println(param);
    }

    public static void main(String[] args) {
        App app = (App) CGLibProxy.getInstance(App.class);
        app.doSomething("hi");
    }
}
//    打印结果
/*    before
      hi
      after    */

Original: https://blog.csdn.net/weixin_46899412/article/details/128749234
Author: AGi_
Title: 仿写Dubbo-Java代理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/812979/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球