java this$0_java中this$0的含义及用法
java中this$0的含義及用法
(2012-01-19 22:43:33)
標簽:
雜談
java中this$0的含義及用法,具體case是這樣的:
通過測試工具去探測界面UI上的控件FlatButton實例對象,但是拿到的最終對象是FlatButton的內部類TextButton對象,
所以這里需要從一個內部類的實例拿到所在外部類的實例,this$0這時就派上用處了。
示例方案如下:
//通過工具獲取到TextButton實例對象
textButton=getButtonByToolMethod ();
//獲取內部類TextButton的一個字段this$0信息
//this$0特指該內部類所在的外部類的引用,不需要手動定義,編譯時自動加上
Filed
outerField=textButton.getClass().getDeclaredField("this$0");
//this$0是私有的,提升訪問權限
outerField.setAccessible(true);
//拿到該字段上的實例值
FlatButton flatButton=(FlatButton)outerField.get(textButton);
this$0就是內部類所自動保留的一個指向所在外部類的引用。
另外,受到$后的數字0啟發,發現原來數字還可以有1,2,3..., 具體可以看如下代碼就一清二楚了.
//Outer.java
public class Outer {//this$0
public class FirstInner {//this$1
public class SecondInner {//this$2
public class ThirdInner {
}
}
}
public static void main(String[] args) throws Exception{
//初始化各內外實例
Outer test = new Outer();
FirstInner first = test.new FirstInner();
FirstInner.SecondInner second = first.new SecondInner();
FirstInner.SecondInner.ThirdInner third=second.new
ThirdInner();
//Outer,this$0
Field outerfield =
first.getClass().getDeclaredField("this$0");
outerfield.setAccessible(true);
Object object = outerfield.get(first);
System.out.println(object instanceof Outer);
//FirstInner,this$1
Field firstInnerfied =
second.getClass().getDeclaredField("this$1");
firstInnerfied.setAccessible(true);
object = firstInnerfied.get(second);
System.out.println(object instanceof FirstInner);
//SecondInner,this$2
Field secondInnerfield =
third.getClass().getDeclaredField("this$2");
secondInnerfield.setAccessible(true);
object = secondInnerfield.get(third);
System.out.println(object instanceof FirstInner.SecondInner);
}
}
其實用 Java 反編譯工具生成內部類可以更加清楚
public class Outer$FirstInner{//FirstInner內部類有一個帶外部類參數的構造子
public Outer$FirstInner(Outer paramOuter) {}
....
}
public class Outer$FirstInner$SecondInner{
public Outer$FirstInner$SecondInner(Outer.FirstInner
paramFirstInner){}
....
}
public class Outer$FirstInner$SecondInner$ThirdInner{
public
Outer$FirstInner$SecondInner$ThirdInner(Outer.FirstInner.SecondInner
paramSecondInner){}
}
可見每個內部類都有一個指向所在最近的外部類的一個引用,只不過該引用不需要手動添加,編譯器會負責。
分享:
喜歡
0
贈金筆
加載中,請稍候......
評論加載中,請稍候...
發評論
登錄名: 密碼: 找回密碼 注冊記住登錄狀態
昵???稱:
評論并轉載此博文
發評論
以上網友發言只代表其個人觀點,不代表新浪網的觀點或立場。
總結
以上是生活随笔為你收集整理的java this$0_java中this$0的含义及用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt5.5 静态编译 mysql_QT5
- 下一篇: 主从mysql能过滤指定dml吗_MyC