亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android Studio 自定義Debug變量視圖的方法

 更新時間:2018年07月30日 10:26:48   作者:Puke''s Blog  
這篇文章主要介紹了Android Studio 自定義Debug變量視圖的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

我們在使用IntelliJ的IDE進行Debug時,去查看一個未重寫 toString 方法的對象需要展開當前的視圖層級才能看到里面的屬性,而通過自定義變量視圖的方式可以直接查看,很大程度上提高Debug的效率。

引出問題

我們在Debug查看變量時通常會遇到這種情況

此時我想查看 Goods 對象里面的具體屬性值,需要點擊左邊的展開按鈕才能查看里面具體的屬性值,不能直接進行查看。更糟糕的是當 Goods 對象在 List 容器中時,我們如果想快速查找到當前 List 里元素的某一項(或幾項)屬性時,就會出現(xiàn)在下面的情況,我們只能逐一元素進行展開操作才能查看到元素對應的信息。

重寫toString及其局限性

上述問題的一般解決方式是重寫該類的 toString 方法,然后重新運行Porject,再次Debug時便可以看到變量的視圖會自動變?yōu)?toString 方法的返回值,如下

這樣便能無需展開直接顯示 Goods 類的成員變量了,但該方式有幾個缺點

  • 添加 GoodstoString 方法之后需要重新運行
  • 如果 Goods 是被依賴的 jar 這種已經被編譯的只讀類,則無法更改
  • 對于 Goods 中包含大量屬性(比如20+個)的情況下,無法全部顯示完,所以就無法根據(jù)自己的需求決定查看具體哪些屬性值 自定義變量視圖

IDE提供給我們一種自定義變量視圖的方式,專門用來解決上面的問題并彌補了 toString 方法的不足。這里會有個 變量解析器 的概念,它用來控制當前變量的顯示值(即debug時顯示在該變量后面的內容,下稱”變量視圖”)。

首先Debug狀態(tài)下右擊變量,選擇 Customize Data Views

接下來在 Customize Data Views 彈窗的Tab中選擇 Java Type Renderers 項,如下

點擊 + 來添加一個自定義的 變量解析器

自定義一個 變量解析器 ,主要需要添加的是名稱、解析類型和解析方式三部分。

名稱:該解析器的標識名稱

解析類型:表示當前的解析器只對哪種類型的類進行解析

解析方式:此處是核心部分,可以寫一個Java表達式,也可以寫一段代碼,這里的返回值就是該變量視圖

我們可以在IDE中添加多個 變量解析器 ,通過控制它的開啟、禁用、順序、適用類等來控制當前變量的顯示情況,下面進行一次完整的操作流程演示

 

通過自定義 變量解析器 的好處是不需要重新運行整個Project;而且還可以在Debug期間動態(tài)切換變量視圖,比如

  • 查看 name 屬性時: "name: " + getName()
  • 查看 type 屬性時: "type: " + getType()
  • 查看 title 屬性時: "title: " + getTitle()
  • ……

再進一步抽象

看了官網的自定義Debug變量視圖這部分介紹后,感覺著實對于Debug很實用,通過自實現(xiàn)的方式使得開發(fā)者能夠動態(tài)化控制變量視圖。

自定義 變量解析器 的方式已經能夠解決開篇提到的問題,但我更希望能通過它來找到控制變量視圖的通法,即寫一個通用的 變量解析器 而不是每debug一種類型的變量就單獨添加一個解析器。接下來要做的事情很清楚了,就是添加一個能夠將對象實例序列化成字符串的方法即可。最先想到的是通過Json進行轉化,但Json一般依賴三方包,而我們想讓Debug功能能夠跟IDE是統(tǒng)一基準線的,所以盡可能選擇使用Jdk自帶的api。

于是考慮到了反射,對于一般通用的變量視圖,我們可以直接通過反射取到每個屬性名,然后結合當前實例來獲取屬性值,直接在上面的 解析類型 中指定為 java.lang.Object 以支持所有類型變量的解析, 解析方式 中添加下面的代碼

if (((Object) this) instanceof String
    || ((Object) this) instanceof Number
    || ((Object) this) instanceof Class) {
  return ((Object) this);
}
StringBuilder sb = new StringBuilder("{");
Class<?> cls = ((Object) this).getClass();
java.lang.reflect.Field[] fields = cls.getDeclaredFields();
if (fields != null) {
  int size = fields.length;
  for (java.lang.reflect.Field field : fields) {
    field.setAccessible(true);
    Object value = field.get((Object) this);
    sb.append(field.getName())
        .append("=")
        .append(String.valueOf(value));
    if (--size > 0) {
      sb.append(", ");
    }
  }
}
return sb.append("}").toString();

添加完畢之后,會發(fā)現(xiàn)此時我們的IDE在Debug時異常強大,所有類型的變量視圖均自動轉化成 key-value 形式的字符串,再也不用為了Debug變量而重寫 toString 方法??聪翫ebug的效果

這里的 UserGoods 類均沒有重寫 toString 方法,但都能通過上面添加的通用解析器來進行變量視圖解析。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 中的 XRecyclerview的使用案例

    Android 中的 XRecyclerview的使用案例

    這篇文章主要介紹了Android 中的 XRecyclerview的使用案例,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Android自定義View新年煙花、祝福語橫幅動畫

    Android自定義View新年煙花、祝福語橫幅動畫

    這篇文章主要為大家詳細介紹了Android自定義View新年煙花、祝福語橫幅動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Android中切換到主線程執(zhí)行的方法

    Android中切換到主線程執(zhí)行的方法

    這篇文章主要介紹了Android中切換到主線程執(zhí)行的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Android使用MediaPlayer和TextureView實現(xiàn)視頻無縫切換

    Android使用MediaPlayer和TextureView實現(xiàn)視頻無縫切換

    這篇文章主要為大家詳細介紹了Android使用MediaPlayer和TextureView實現(xiàn)視頻無縫切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Android兩種輪詢的實現(xiàn)方法

    Android兩種輪詢的實現(xiàn)方法

    這篇文章主要為大家詳細介紹了Android兩種輪詢的實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Android藍牙通信聊天實現(xiàn)發(fā)送和接受功能

    Android藍牙通信聊天實現(xiàn)發(fā)送和接受功能

    這篇文章主要為大家詳細介紹了Android藍牙通信聊天實現(xiàn)發(fā)送和接受功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Spi機制在Android開發(fā)的應用示例詳解

    Spi機制在Android開發(fā)的應用示例詳解

    這篇文章主要為大家介紹了Spi機制在Android開發(fā)的應用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Android SurfaceView與TextureView使用方法詳細講解

    Android SurfaceView與TextureView使用方法詳細講解

    SurfaceView和TextureView都繼承View,與普通的View不同的是,它倆可以在獨立線程中繪制渲染,性能更高,所以常被應用在對繪制速率要求比較高的場景,比如相機預覽,視頻播放等等
    2022-10-10
  • Android自定義控件實現(xiàn)雷達圖效果

    Android自定義控件實現(xiàn)雷達圖效果

    這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)雷達圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android Kotlin環(huán)境使用ButterKnife的方法

    Android Kotlin環(huán)境使用ButterKnife的方法

    本篇文章主要介紹了Android Kotlin環(huán)境使用ButterKnife的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論