flink1.19源码学习-动态代理(1)

发布于:2024-04-08 ⋅ 阅读:(167) ⋅ 点赞:(0)

flink1.19源码学习-动态代理

这一节很简单,但是很重要。

由于flink源码中大量用到了动态代理,所以第一节还是先把基本知识交代清楚,方便我们接下来的学习。

Java 动态代理是一种用于创建动态代理类和代理对象的方法,它可以在运行时动态地对方法进行增强。

实现

通过一个简单的例子,迅速掌握动态代理

ResourceManagerGateway

public interface ResourceManagerGateway {
    /**
     * 定义一个注册方法
     */
    void registerTaskExecutor();
}

ResourceManager

public class ResourceManager implements ResourceManagerGateway{
    @Override
    public void registerTaskExecutor() {
        System.out.println("注册registerTaskExecutor");
    }
}


PekkoInvocationHandler

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class PekkoInvocationHandler implements InvocationHandler {

    private Object target;

    public PekkoInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {


        return invokeRpc(method,args);
    }

    private Object invokeRpc(Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
        System.out.println("调用pekko ask方法向ResourceManager发送调用的方法");
        Object res = method.invoke(target, args);
        System.out.println("结束调用");
        return res;
    }
}


Demo

import java.lang.reflect.Proxy;

public class Demo {

    public static void main(String[] args) {
        /** 创建目标对象 */
        ResourceManager myObject = new ResourceManager();
        /** 创建InvocationHandler */
        PekkoInvocationHandler handler = new PekkoInvocationHandler(myObject);

        ResourceManagerGateway proxy = (ResourceManagerGateway) Proxy.newProxyInstance(
                ResourceManagerGateway.class.getClassLoader(),
                new Class[]{ResourceManagerGateway.class},
                handler);

        proxy.registerTaskExecutor();
    }
}


运行结果

调用pekko ask方法向ResourceManager发送调用的方法
注册registerTaskExecutor
结束调用

总结

在接下来的源码阅读中,动态代理主要与RPC结合使用,对于像flink这种分布式架构来说,RPC是重中之重。所以接下来就学习flink的RPC。


网站公告

今日签到

点亮在社区的每一天
去签到