我是靠谱客的博主 光亮茉莉,这篇文章主要介绍Java 在匿名内部函数中为外部函数变量赋值的解决方案,现在分享给大家,希望可以做个参考。

新人一枚,请多包涵。

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

    就比如okHttp3 的接口调用

复制代码
1
2
3
4
5
6
7
8
9
10
11
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呢?

【解决方案】

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的修饰不熟悉啊。


复制代码
1

最后

以上就是光亮茉莉最近收集整理的关于Java 在匿名内部函数中为外部函数变量赋值的解决方案的全部内容,更多相关Java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部