class GrpcClientBeanInjector implements BeanInjector<GrpcClient> {
    Map<Class<?>, Object> clientMap;

    public GrpcClientBeanInjector(Map<Class<?>, Object> clientMap) {
        this.clientMap = clientMap;
    }

    @Override
    public void doInject(VarHolder varH, GrpcClient anno) {<FILL_FUNCTION_BODY>}
}

        Method method;
        Object grpcCli = clientMap.get(varH.getType());
        String name = Utils.annoAlias(anno.value(), anno.name());

        if (grpcCli != null) {
            varH.setValue(grpcCli);
        } else {
            Channel grpcChannel = new GrpcChannelProxy(anno.group(), name);
            Class<?> grpcClz = ClassUtil.loadClass(varH.getType().getName().split("\\$")[0]);

            try {
                //同步
                if (AbstractBlockingStub.class.isAssignableFrom(varH.getType())) {
                    method = grpcClz.getDeclaredMethod("newBlockingStub", Channel.class);
                    grpcCli = method.invoke(null, new Object[]{grpcChannel});
                }

                //异步
                if (AbstractFutureStub.class.isAssignableFrom(varH.getType())) {
                    method = grpcClz.getDeclaredMethod("newFutureStub", Channel.class);
                    grpcCli = method.invoke(null, new Object[]{grpcChannel});
                }

                if (grpcCli != null) {
                    clientMap.put(varH.getType(), grpcCli);
                    varH.setValue(grpcCli);
                }
            } catch (RuntimeException e) {
                throw e;
            } catch (Throwable e) {
                throw new RuntimeException(e);
            }
        }
    
<no_super_class>