Java 在匿名内部函数中为外部函数变量赋值的解决方案
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 在匿名内部函数中为外部函数变量赋值的解决方案的更多相关文章
- Java通过匿名类来实现回调函数
在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...
- C#:在匿名方法中捕获外部变量
先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void T ...
- 在artTemplate的标签中使用外部函数的方法
第一步,声明函数,并将函数作为data对象的属性.例如: var resArray = new Array(); function beforeRender(data) { //addToArray为 ...
- js中解决函数中使用外部函数局部变量的问题(闭包问题)
如果要取得外部for循环中i的值则必须使用闭包才能解决 如果不使用闭包,直接使用 变量 i 的值是无效的,因为 i 已经在函数调用之前被回收了,所以你是调用不到它的!
- Python3基础 nonlocal关键字 内部函数访问到外部函数的变量
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- 一般处理程序 ashx中使用外部Session 出现不存在 解决方案
MXS&Vincene ─╄OvЁ &0000004 ─╄OvЁ MXS&Vincene MXS&Vincene ─╄OvЁ:今天很残酷,明天更残酷,后天很美好 ...
- python第十六课——外部函数and内部函数
1.外部函数&内部函数 内部函数: 定义在某个函数的内部,就是内部函数: [注意事项]: 1).内部函数可以随意使用它外部函数中的内容 2).外部函数不能使用内部函数中的内容 3).内部函数不 ...
- 【C语言】外部函数和内部函数
目录 [外部函数] [内部函数] 1.外部函数 定义的函数能被本文件和其它文件访问(默认). 注:不允许有同名的外部函数. 2.内部函数 定义的函数只能被本文件访问,其它文件不能访问. 注:允许 ...
- 如何在 ejs 模板中使用 helper function 外部函数进行特殊处理?
一般我们想要在 ejs 模板中使用外部函数用于特殊的处理,比如:<%= ellipsis(title, 30) %> 通常的做法是: 使用 app.locals 来定义: app.loca ...
随机推荐
- Flask学习-Flask基础之WSGI
一.WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢? 我们知道,部署一个web应用,经常需要使用nginx.apache或者IIS等web服务 ...
- Flutter - ListView禁止用户上下滑动
ListView禁止用户上下滑动可以使用physics属性 physics: const NeverScrollableScrollPhysics()
- Spring学习(十九)----- Spring与WEB容器整合
首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...
- SpringBoot日记——编码配置篇
插入一个小篇章,有人在编写代码的时候,要么控制台乱码,要么页面乱码等等, 我这里有个配置,可以解决各种乱码问题,直接来看. # ==================== 编码配置 ========== ...
- centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...
- Unity特殊路径
Resources: Resources文件可以在根目录下,也可以在子目录下,只要叫Resources就好.Resources目录下所有资源将被打包进游戏存放资源的archive中,Resources ...
- pytorch 对变长序列的处理
一开始写这篇随笔的时候还没有了解到 Dateloader有一个 collate_fn 的参数,通过定义一个collate_fn 函数,其实很多batch补齐到当前batch最长的操作可以放在colla ...
- EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
先回答一下上一节中留下的问题,为什么我就看不到eosio这个账户中的钱呢?我明明为它create了很多token啊. 对,你是create了,但是没有issue啊.create了1000000000 ...
- GoldNumber游戏比赛成绩公布
比赛介绍:http://www.cnblogs.com/xinz/p/3347418.html 黄金点游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁 ...
- Linux内核分析作业第二周
操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三 ...