zoukankan      html  css  js  c++  java
  • 反编译中的 匿名内部类 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修饰。

  • 相关阅读:
    2020-2021-1 20209324 《Linux内核原理与分析》第八周作业
    2020-2021-1 20209324《Linux内核原理与分析》第七周作业
    2019-2020-1 20209324《Linux内核原理与分析》第六周作业
    2020-2021-1 20209324《Linux内核原理与分析》第五周作业
    2019-2020-1 20209324《Linux内核原理与分析》第四周作业
    2019-2020-1 20209324《Linux内核原理与分析》第三周作业
    2019-2020-1 20209324《Linux内核原理与分析》第二周作业
    T-Sql 递归查询
    JS浏览器兼容问题
    IE && FireFox在javascript上的区别
  • 原文地址:https://www.cnblogs.com/libin6505/p/10966509.html
Copyright © 2011-2022 走看看