转:

匿名内部类 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$的问题【我改】的更多相关文章

  1. apk反编译工具

    反编译工具: apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar:将apk反编译成Java源码(classes.dex转化成jar文件) jd-gui:查看APK中 ...

  2. 从反编译的角度去观察C#6.0

    1. 自动属性初始化 (Initializers for auto-properties) 1.1 C#6.0 之前的写法 public class FirstExperience { private ...

  3. Android开发学习之路--逆向分析反编译

      一般情况下我们想要了解别人的app怎么实现这个动画,这个效果的时候,总是会想到反编译一下,看下布局,看下代码实现.对,这对于有经验的玩家确实手到擒来了,但是初学者,根本就不知道怎么反编译,怎么看代 ...

  4. 使用ILSpy软件反编译.Net应用程序的方法及注意事项

    今天遇到之前同事写的代码没有源码了,但是客户要在原来的基础上修改程序!好在没有做加壳处理,所以就用了ILSpy软件进行反编译!下面把步骤及遇到的问题写下来: 1.打开ILSpy软件,点击File  , ...

  5. ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用

    转载请注明出处:http://blog.csdn.net/fightlei/article/details/52432161 最近在学习Android反编译的一些知识,虽然在网上搜到了很多相关的文章, ...

  6. Android反编译初步

    网上关于Android反编译的帖子很多,反编译的步骤也是很详细,本文Android反编译参考博客:https://www.cnblogs.com/dhcn/p/7120891.html 而反编译中最主 ...

  7. 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 ...

  8. 如何保护.net中的dll文件(防破解、反编译)

    如何保护.net中的dll文件(防破解.反编译) 2010-07-19 15:08 [小 大] 来源: 赛迪网 评论: 0 分享至:      百度权重查询 词库网 网站监控 服务器监控 SEO监控  ...

  9. Java 7 中的Switch 谈 Java版本更新和反编译知识

    Java 7 中的Switch 谈 Java版本更新和反编译知识          学习编程,享受生活,大家好,我是追寻梦的飞飞.今天主要讲述的是Java7中的更新Switch实现内部原理和JAD反编 ...

随机推荐

  1. BLE 5协议栈-通用访问规范层(GAP)

    文章转载自:http://www.sunyouqun.com/2017/04/ 通用访问规范GAP(Generic Access Profile)是BLE设备内部功能对外的接口层,它规定了三个方面:G ...

  2. zabbix 自定义Key (六)

    1.在zabbix_agent端zabbix_agentd.conf配置文件中增加自定义Key(/usr/local/zabbix_agent/etc/zabbix_agentd.conf) ### ...

  3. LNMP安装与配置之Python3

    环境 我们是在CentOS7下安装python3,但CentOS已经默认安装了Python2,而 Yum 等工具依赖原来的Python2.所以我们需要稍作配置让Python2与Python3可以共存. ...

  4. SPOJ 1825 经过不超过K个黑点的树上最长路径 点分治

    每一次枚举到重心 按子树中的黑点数SORT一下 启发式合并 #include<cstdio> #include<cstring> #include<algorithm&g ...

  5. 源码安装 qemu-2.0.0 及其依赖 glib-2.12.12

    源码安装qemu-2.0.0 下载源代码并解压 http://wiki.qemu-project.org/download/qemu-2.0.0.tar.bz2 .tar.gz 编译及安装: cd q ...

  6. 深入理解python协程

    目录 概述 生成器变形 yield/send yield send yield from asyncio.coroutine和yield from async和await 概述 由于 cpu和 磁盘读 ...

  7. js 密码为空显示错误

    <script> var user = document.getElementById("user"); var pwd = document.getElementBy ...

  8. React-native 触摸事件

    http://www.360doc.com/content/16/0711/23/34978982_574835465.shtml

  9. [HNOI2008][bzoj 1005]明明的烦恼(prufer序列)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7121  Solved: 2816[Submit][Stat ...

  10. Trie树(c++实现)——转载自jihite的博客

    Trie树(c++实现)   原理 先看个例子,存储字符串abc.ab.abm.abcde.pm可以利用以下方式存储 上边就是Trie树的基本原理:利用字串的公共前缀来节省存储空间,最大限度的减少无谓 ...