码迷,mamicode.com
首页 > 编程语言 > 详细

Java 在匿名内部函数中为外部函数变量赋值的解决方案

时间:2018-11-06 16:39:10      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:方案   art   _id   control   个人   err   key   queue   用户   

 Java匿名内部函数本人不怎么主动使用,但是经常会调用一些API,其中会调用一些接口,而这些接口是需要使用匿名内部类来实现的,于是就遇到了一些问题。

    就比如okHttp3 的接口调用

 OkHttpClient okHttpClient = new OkHttpClient();

            final Request okRequest = new Request.Builder()

                    .url(url)

                    .build();

            Call call = okHttpClient.newCall(okRequest);

            call.enqueue(new Callback() {

                @Override

                public void onFailure(Call call, IOException e) {

                    

                }

 

                @Override

                public void onResponse(Call call, Response response) throws IOException {});

  

 就要使用匿名内部类。

    这一用不要紧,一个问题却难到了我,由于需要写一个微信登陆的Controller,需要从微信端获取用户的js_code再由服务器向微信服务器发送data以换取用户的openId以及sessionKey,于是就想到了okhttp3。

    由于内部类的机制,内部类在使用外部类的成员变量时,该变量必须是final修饰的,至于理由,我觉得这个博客写的很生动:点击打开链接。因此,如果想在内部类直接为外部类变量赋值的话是不可行的。那么我如何在外部类得到我在匿名内部类中获取取的openId呢?

【解决方案】

public Map<String,Object> loginWithWechat(HttpServletRequest request){
        
        String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="+APP_ID
                +"&secret=" + SECRET + "&js_code=" + jsCode + "&grant_type=authorization_code";
        OkHttpClient okHttpClient = new OkHttpClient();        
        final Request okRequest = new Request.Builder()
                .url(loginUrl)
                .build();
        Call call = okHttpClient.newCall(okRequest);
        final Map<String, Object> resultMap = new HashMap<>();
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
 
            }
 
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String jsonRes = response.body().string();
                resultMap.put("json",jsonRes);
            }
        });
        String jsonStr = resultMap.get("json");
    }

【个人总结】

    不只是Map,对象也可以通过get() set()方法获取匿名内部函数的变量。原来,虽然final不能改变变量地址,但是可以改变对象的成员变量,看来还是对Java final的修饰不熟悉啊。

 

https://blog.csdn.net/qq_37292960/article/details/81036793

Java 在匿名内部函数中为外部函数变量赋值的解决方案

标签:方案   art   _id   control   个人   err   key   queue   用户   

原文地址:https://www.cnblogs.com/twoheads/p/9915788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!