问答详情
源自:4-6 如何支持 Kotlin 协程的 suspend 函数?

在kotlin里面要怎么返回一个挂起函数而有不用标记?

那个动态代理是用java写的,传了个continuation进去就不需要标记挂起函数。但是如果是在kotlin中,这里会被要求标记为挂起函数或者协程中使用,而java的proxy的invoice是没有挂起函数标记的,没法用啊?应该怎么处理啊?java的写好了,但是改成kotlin不会?

public static <T> T create(Class<T> service) {
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service}
            , (o, method, args) -> {
                String url = "";
                BaseParam requestParam = null;
                String requestMethod = "GET";
                Class<?> returnT = method.getReturnType();
                if (returnT == null || BaseResponse.class.isAssignableFrom(returnT)) {
                    throw new RuntimeException("返回类型不是BaseResponse");
                }
                if (method.getGenericReturnType() == Continuation.class && args != null && args.length > 0) {
                    int len = args.length;
                    Class clazz;
                    for (int i = 0; i < len; i++) {
                        clazz = args[i].getClass();
                        if (BaseParam.class.isAssignableFrom(clazz)) {
                            requestParam = (BaseParam) args[i];
                        }
                    }
                    if (requestParam == null) {
                        requestParam = new BaseParam();
                    }

                    if (method.isAnnotationPresent(APIGet.class)) {
                        url = method.getAnnotation(APIGet.class).value();
                    } else if (method.isAnnotationPresent(APIPost.class)) {
                        url = method.getAnnotation(APIPost.class).value();
                        requestMethod = "POST";
                    }
                    Continuation<?> continuation = (Continuation<?>) args[args.length - 1];
                    return OkHttpProxy.INSTANCE.await(NetWorkManager.Companion.getInstance().call(url, requestParam, requestMethod), returnT, continuation);
                }
                return null;
            });
}


提问者:毛豆先生在广州 2021-03-21 14:29

个回答