posts - 72, comments - 66, trackbacks - 0, articles - 0

          有關 this$0 問題

          Posted on 2009-01-06 12:24 Fingki.li 閱讀(3476) 評論(0)  編輯  收藏 所屬分類: About development
          有synthetic標記的field和method是class內部使用的,正常的源代碼里不會出現synthetic field。小穎編譯工具用的就是jad.所有反編譯工具都不能保證完全正確地反編譯class。所以你不能要求太多。
          下面我給大家介紹一下synthetic

          下面的例子是最常見的synthetic field
          class parent
          {
          public void foo()
          {
          }
          class inner
          {
          inner()
          {
          foo();
          }
          }
          }
          非static的inner class里面都會有一個this$0的字段保存它的父對象。編譯后的inner class 就像下面這樣:
          class parent$inner
          {
          synthetic parent this$0;
          parent$inner(parent this$0)
          {
          this.this$0 = this$0;
          this$0.foo();
          }
          }
          所有父對象的非私有成員都通過 this$0來訪問。

          還有許多用到synthetic的地方。比如使用了assert 關鍵字的class會有一個
          synthetic static boolean $assertionsDisabled 字段
          使用了assert的地方
          assert condition;
          在class里被編譯成
          if(!$assertionsDisabled && !condition)
          {
          throw new AssertionError();
          }

          還有,在jvm里,所有class的私有成員都不允許在其他類里訪問,包括它的inner class。在java語言里inner class是可以訪問父類的私有成員的。在class里是用如下的方法實現的:
          class parent
          {
          private int value = 0;
          synthetic static int access$000(parent obj)
          {
          return value;
          }
          }
          在inner class里通過access$000來訪問value字段。

          摘自:
          http://www.cjsdn.net/post/print?bid=1&id=130784
          主站蜘蛛池模板: 封丘县| 平武县| 南宫市| 新泰市| 珲春市| 湛江市| 馆陶县| 泸定县| 肥城市| 富平县| 嘉善县| 西充县| 行唐县| 上高县| 京山县| 宜丰县| 夹江县| 信阳市| 宜城市| 汕头市| 舒城县| 汾西县| 昭苏县| 平果县| 鲁山县| 锦州市| 汉中市| 定安县| 虹口区| 大方县| 卓尼县| 达州市| 黄浦区| 潮州市| 无极县| 高唐县| 贵阳市| 革吉县| 泗洪县| 乐平市| 枝江市|