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 ...
随机推荐
- 06-docker组件如何协作
容器启动过程如下: Docker 客户端执行 docker run 命令. Docker daemon 发现本地没有 httpd 镜像. daemon 从 Docker Hub 下载镜像. 下载完成, ...
- PAT甲题题解-1077. Kuchiguse (20)-找相同后缀
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- 团队作业Week6:规格说明书编写
(1)请分析你们团队项目的典型用户和场景,并写一个团队博客发布你们团队项目的功能规格说明书. (2)再写一个博客团队博客发布你们项目的设计文档(技术规格说明书). 截止时间:2015-11-03
- C#使用结构体,输入5个人的学号,姓名,分数,按照成绩高低排列打印出来
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- GITHUB使用及入门总结
这是我第一次应用git,以下仅供git的初学者参考. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.这对于一般人来说 ...
- JavaMail实现邮箱之间发送邮件功能
package com.minstone.message.util; import java.util.Date; import java.util.Properties; import javax. ...
- Linux 下安装nginx的总结 (之前写的有问题))
1. 下载niginx的 tar包 下载路径 http://nginx.org/en/download.html 也可以直接使用命令下载 wget http://nginx.org/download/ ...
- 32位机和64位机下面各类型sizeof的大小
---<这种类型的题目出的太多了,还是整理下吧!>--- 一.机器平台:X86_64 处理器 操作系统:Red Hat 4.1.2-14 编译器: gcc version 4.1.2 20 ...
- 三星a9上测试egret与pixi.js的渲染性能
for (let i = 0; i < 500; i++) { let shape = new egret.Shape(); shape.graphics.beginFill(0xff0000) ...
- DELPHI动态创建窗体
//第一种方式 procedure TForm1.btn1Click(Sender: TObject); begin With TForm2.Create(Application) do Try Sh ...