反编译中的 匿名内部类 this.val$的问题【我改】
转:
匿名内部类 this.val$的问题
一天偶尔在网上找到一个jar包,反编译后出现了如下的代码:
public void defineAnonymousInnerClass(String name)
{
new Thread(name) { //extra constructor argument "name"
public void run() {
System.out.println(this.val$name); //"this.val$" is extra
}
}
.start();
}
当看到红色的部分时,我就纠结了。这是什么东西还能这么使用?后来在百度上搜索答案,却始终不得答案。最终在google找到了答案。
链接地址:http://www.mindfiresolutions.com/A-tip-on-val$-field-in-Java-decompiled-code-1725.php
其实,我是被编译器给玩了。这些代码都是编译器反编译的时候自己添加上去的。
第一个问题:匿名内部类要使用外面的参数,必须要加final。而代码中却没有加。
第二个问题:new Thread 这个类没有带参数的构造器。
第三个问题:this.val$这种用法很怪异,val$是哪里来的。
这些问题都是反编译器给我们搞的鬼。
我们在学习匿名内部类的时候都知道,匿名内部类要使用外部的变量,或者参数,这个变量和参数都必须是final类型。而且匿名内部类没有构造器他的构造器是继承于父类,这就还有一个问题就是那我们如何初始化内名内部类中的变量,只需要使用“{}”在里面初始化变量不需要任何修饰。再就是在匿名内部类中this表示当前对象,如果要使用外部类对象需要加上Outclass.this这才是外部对象。
所以以上代码我们做如下修改:
public void defineAnonymousInnerClass(final String name)//参数加上final
{
new Thread() { //额外的参数去掉
public void run() {
System.out.println(name); //"this.val$" 多余的去掉
}
}
.start();
}
这时我们就可以正常运行了,其实都是编译器搞的鬼。
这是我第一次写博客,如有写的不对的地方请各位大侠们指教。
。。。。。
一次反编译后出现的问题:
反编译后,导入Eclipse,发现如下错误
问题1:出现 access$002 报错
阅读代码,并没有发现这行代码有什么用处,所以,直接注释掉,经过测试,没有任何问题,可见这行可能是反编译时自动生成的多余代码。
解决方法:
直接注释掉。
问题2:出现 this.val$jarfilePathText 这样的错误
经过分析代码,发现,这个报错的部分,其实应该就是指前面定义的 变量 JTextField jarfilePathText = new JTextField(10); 因为其非常相似,只是在变量前多了 val$ ,结合前面的博客可知,这是由于反编译时没有给内部类中要使用的变量加final属性。
修改方式:
去掉 报错变量的 val$ ,然后在定义的地方 加上 final修饰。
反编译中的 匿名内部类 this.val$的问题【我改】的更多相关文章
- apk反编译工具
反编译工具: apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar:将apk反编译成Java源码(classes.dex转化成jar文件) jd-gui:查看APK中 ...
- 从反编译的角度去观察C#6.0
1. 自动属性初始化 (Initializers for auto-properties) 1.1 C#6.0 之前的写法 public class FirstExperience { private ...
- Android开发学习之路--逆向分析反编译
一般情况下我们想要了解别人的app怎么实现这个动画,这个效果的时候,总是会想到反编译一下,看下布局,看下代码实现.对,这对于有经验的玩家确实手到擒来了,但是初学者,根本就不知道怎么反编译,怎么看代 ...
- 使用ILSpy软件反编译.Net应用程序的方法及注意事项
今天遇到之前同事写的代码没有源码了,但是客户要在原来的基础上修改程序!好在没有做加壳处理,所以就用了ILSpy软件进行反编译!下面把步骤及遇到的问题写下来: 1.打开ILSpy软件,点击File , ...
- ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用
转载请注明出处:http://blog.csdn.net/fightlei/article/details/52432161 最近在学习Android反编译的一些知识,虽然在网上搜到了很多相关的文章, ...
- Android反编译初步
网上关于Android反编译的帖子很多,反编译的步骤也是很详细,本文Android反编译参考博客:https://www.cnblogs.com/dhcn/p/7120891.html 而反编译中最主 ...
- Android的APK文件的反编译方法【转】
实用的收藏一下. 来自:http://www.dewen.org/q/711/%E8%AF%B7%E6%95%99Android%E7%9A%84APK%E6%96%87%E4%BB%B6%E7%9A ...
- 如何保护.net中的dll文件(防破解、反编译)
如何保护.net中的dll文件(防破解.反编译) 2010-07-19 15:08 [小 大] 来源: 赛迪网 评论: 0 分享至: 百度权重查询 词库网 网站监控 服务器监控 SEO监控 ...
- Java 7 中的Switch 谈 Java版本更新和反编译知识
Java 7 中的Switch 谈 Java版本更新和反编译知识 学习编程,享受生活,大家好,我是追寻梦的飞飞.今天主要讲述的是Java7中的更新Switch实现内部原理和JAD反编 ...
随机推荐
- mysql-mmm实现高可用和部署时须要考虑的问题
mysql-mmm简介 Multi-Master Replication Manager for MySQL,简称mmm,官方的介绍可以参考mmm官网.好处自然不用说,读写分离,官方称读能做到负载均衡 ...
- Java 包装类及其与String转换、进制转换
一.包装类 1.基本类型和引用类型 Java中的基本类型我们都知道有8种,但是作为基本类型限制功能的发挥,例如整形转String类型等可能需要类方法实现会更加简便.那么八个基本类型对应八个包装类,即引 ...
- Fetch(原生)的简单使用
前言: Fetch 提供了对 Request 和 Response 等对象通用的定义. 发送请求或者获取资源,需要使用 fetch() 方法. 具体使用代码: <script> fetch ...
- Python字符串运算符
下表实例变量 a 值为字符串 "Hello",b 变量值为 "Python": 操作符 描述 实例 + 字符串连接 >>>a + b 'Hel ...
- 打开图像文件失败汇总:“Could not load image... ...0x## 0x##”错误
造冰箱的熊猫@cnblogs 2018/12/15 在Ubuntu上使用Image Viewer打开图片文件时,有时会遇到“Could not load image '001.jpg'. Error ...
- codevs 1009 产生数 2002年NOIP全国联赛普及组 x (内附解析w)
题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规 ...
- 'findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件
今天通过windows cmd客户端输入: solr.cmd start ,启动solr时,提示"findstr' 不是内部或外部命令,也不是可运行的程序或批处理文件" 这是PAT ...
- 「SDOI2017」数字表格
题目链接 问题分析 \[ \begin{aligned} Ans&=\prod_{i=1}^n\prod_{j=1}^mf[\gcd(i,j)]\\ &=\prod_{t=1}^nf( ...
- AtCoder AGC009E Eternal Average (DP)
题目链接 https://atcoder.jp/contests/agc009/tasks/agc009_e 题解 又被劝退了... 第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\ ...
- linux内核中的数据结构
http://vinllen.com/linuxnei-he-zhong-de-shu-ju-jie-gou/ https://zhuanlan.zhihu.com/p/58087261 https: ...