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 在匿名内部函数中为外部函数变量赋值的解决方案的更多相关文章

  1. Java通过匿名类来实现回调函数

    在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...

  2. C#:在匿名方法中捕获外部变量

    先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void T ...

  3. 在artTemplate的标签中使用外部函数的方法

    第一步,声明函数,并将函数作为data对象的属性.例如: var resArray = new Array(); function beforeRender(data) { //addToArray为 ...

  4. js中解决函数中使用外部函数局部变量的问题(闭包问题)

    如果要取得外部for循环中i的值则必须使用闭包才能解决 如果不使用闭包,直接使用 变量 i 的值是无效的,因为 i 已经在函数调用之前被回收了,所以你是调用不到它的!

  5. Python3基础 nonlocal关键字 内部函数访问到外部函数的变量

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  6. 一般处理程序 ashx中使用外部Session 出现不存在 解决方案

    MXS&Vincene  ─╄OvЁ  &0000004 ─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好 ...

  7. python第十六课——外部函数and内部函数

    1.外部函数&内部函数 内部函数: 定义在某个函数的内部,就是内部函数: [注意事项]: 1).内部函数可以随意使用它外部函数中的内容 2).外部函数不能使用内部函数中的内容 3).内部函数不 ...

  8. 【C语言】外部函数和内部函数

    目录 [外部函数]  [内部函数] 1.外部函数  定义的函数能被本文件和其它文件访问(默认). 注:不允许有同名的外部函数. 2.内部函数  定义的函数只能被本文件访问,其它文件不能访问. 注:允许 ...

  9. 如何在 ejs 模板中使用 helper function 外部函数进行特殊处理?

    一般我们想要在 ejs 模板中使用外部函数用于特殊的处理,比如:<%= ellipsis(title, 30) %> 通常的做法是: 使用 app.locals 来定义: app.loca ...

随机推荐

  1. JavaScript快速入门-ECMAScript运算符

    1.逻辑运算符 逻辑与:&&(and) 逻辑或:||(or) 逻辑非:!(not) 逻辑 AND 运算符(&&) 逻辑 AND 运算的运算数可以是任何类型的,不止是 B ...

  2. 软件测试----H模型

    H模型将测试活动完全独立出来,形成一个完整的流程,同时将测试准备和测试执行清晰表现出来. 测试流程: --测试准备:所有测试活动的准备判断是否到测试就绪点. --测试就绪点:测试准入准则,即是否可以开 ...

  3. 镜像仓库管理:与Portus不得不说的那些事

    背景: 目前在做一个云计算相关的项目,其中有这样一个需求:每个平台用户都有自己的docker镜像仓库(docker registry),用户可以对自己的镜像仓库的push/pull权限进行管理,也就是 ...

  4. Redis源码阅读(二)高可用设计——复制

    Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...

  5. 区块链--Bitcoin共识机制

    目录 中心化和去中心化 比特币共识机制 拜占庭将军共识机制 比特币成功解决了拜占庭问题 中心化和去中心化 中心化模式: 优点:效率高 缺点:中间层次太多(组织层次连接) 去中心化模式: 缺点:效率低 ...

  6. sql注入语句整理

    1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select ...

  7. ace how to guide

    Configuring the editor there are several ways to pass configuration to Ace 有几种方法可以将配置传递给ace // pass ...

  8. npm模块之http-proxy-middleware使用教程(译)

    单线程node.js代理中间件,用于连接,快速和浏览器同步 Node.js代理简单. 轻松配置代理中间件连接,快速,浏览器同步等. 由流行的Nodejitsu http代理提供. TL;DR 代理/ ...

  9. Linux内核分析— —计算机是如何工作的(20135213林涵锦)

    实验部分 (以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码, int g(i ...

  10. 3D开机动画

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...