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
          主站蜘蛛池模板: 聊城市| 西乌| 临西县| 新昌县| 汝南县| 永和县| 泸溪县| 通州区| 乌海市| 宁明县| 汤原县| 南溪县| 易门县| 商南县| 新乐市| 斗六市| 乌兰察布市| 夏津县| 武义县| 海安县| 新巴尔虎左旗| 马尔康县| 清镇市| 宜春市| 栾城县| 宜良县| 遂宁市| 黑河市| 德格县| 衢州市| 普兰县| 江阴市| 怀集县| 广宗县| 通江县| 琼中| 富裕县| 内江市| 兴义市| 中西区| 临城县|