日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

定制属于你的HouseMD

發布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定制属于你的HouseMD 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

沒有比新增一些更酷的指令, 更讓人興奮的啦~

要辦到它, 得從下面的類入手.

Command

像env?這樣不需要用到Instrumentation指令, 可以直接繼承Command, 將自定義指令的邏輯實現在run方法中.

切記, 指令只能有一個構造器, 因為只有第一個構造器會被用于實例化指令; 并且, 構造器應至少有一個參數是PrintOut, 用以Command的初始化, 它是用來向控制臺回顯信息的. 不用擔心如何構造一個PrintOut的實例, 只用留好這個參數,?HouseMD會幫我們搞定.

每個指令是如何被執行的呢?

典型的過程是:

  • 首先, 每個Command的具體實現類會被House引導給Duck并由Telephone來實例化它們,
  • 在housemd>提示下輸入一串字符, 按下回車后, 這串字符會被拆分為為指令和其參數選項兩個部分, 通過指令部分匹配相應指令的實例, 而參數選項的部分則交由指令實例的parse方法進行解析,
  • 解析完成后, 指令實例的run方法會被調用
  • 如何聲明參數選項

    Command提供了三種方法來實現聲明:

    • flag?聲明布爾類型的選項, 通常用于開啟什么模式或特定的動作, 例如loaded指令的-h選項
    • option?聲明除布爾類型之外的單值選項, 選項是必須有默認值的, 例如trace的-p選項
    • parameter?聲明參數,
      • 可以聲明多個參數, 輸入的順序與聲明的順序一致
      • 可以是單值或多值, 多個參數的情況下, 只允許最后一個參數是多值
      • 可以設定默認值, 不設的話表明必須要輸入參數.

    請確保參數選項的聲明, 使用在聲明屬性的位置完成的, 目的是為了保證在執行Command的parse方法之前, 所有的聲明已完成.

    細節請參考代碼作為示例:

    • Loaded.scala
    • Trace.scala
    • Env.java
    • Inspect.java

    沒有Instrumentation的Command實現能做什么?

    運行在目標進程的環境中, 很多JVM提供的工具方法就可以拿來了:

    • 像env, 就是通過java.lang.System.getenv()來實現查看目標進程的系統環境變量( 順便提一下, 我刻意沒有實現查看Properities的功能, 留給大家練手用 :D )
    • 還可以利用java.lang.management.ManagementFactory獲得系統提供的管理Bean, 來實現諸如: 查看線程數, 內存, 執行Full GC等等

    總之, 發揮你的想象力, 指令可以運行在目標進程中了, 還有什么可以直接拿來用的呢?

    Instrumentation

    若是要用到Instrumentation的指令, 也同樣要繼承Command, 與?env, 但構造器就要多一個Instrumentation的參數, 如loaded.?HouseMD在實例化指令的時候, 會將Instrumentation的實例傳入.

    指令的構造器最多就Instrumentation和PrintOut兩個參數, 多了會導致實例化失敗.

    TransformCommand

    要實現一個比trace更牛逼的指令, 前面的方法已經足夠讓你辦到了. 但我還是強烈推薦繼承TransformCommand, 它已經幫你實現了字節碼增強的部分(這部分是有很多陷阱的, 除非你有足夠的經驗, 真的如此我熱切的希望你能幫我改進它), 還有常規選項(如-i,-t,-l以及-p) 剩下你需要做的是:

  • 聲明參數
  • 實現isCandidate方法, 以過濾那些需要進行字節碼增強的類,
  • 實現isDecorating方法,以過濾那些需要進行字節碼增強的類的方法,
  • 實現hook方法, 返回一個回調對象, 它的方法會在特定的時機被調用:
  • enterWith會在所跟蹤的方法進入之前調用,?Context對象有方法上下文的數據
  • exitWith?會在所跟蹤的方法退出之后調用,?Context對象有方法上下文的數據
  • heartbeat會像心跳一樣被調用(可能一會快,可能一會慢), 主要用于實時顯示信息, 如trace的調用摘要,?now是當前時間(毫秒)
  • finalize?會在指令結束前調用, 主要用于釋放清理資源, 一旦指令運行中出現了異常,?Option[Throwable]會傳入它.
  • 細節請參考代碼作為示例:

    • Trace.scala
    • Inspect.java

    Completer

    要想自定義的指令具備良好的交互體驗, 那么支持參數自動補全這個功能一定要提供. 實現這點就需要實現Completer接口的complete方法, 具體怎么做, 文字不好描述, 還是看源碼吧.

    不要忘了最后一步

    新增的指令需在HouseagentOptions的值(:: Nil之前)增加一下, 現在方式有點土, 歡迎高手來改進.

    更多相關疑問請提交Issue, 我們一起來討論:)

    完整開發文檔請見這里?

    參考資料

  • BTrace
  • javaagent
  • 動態跟蹤Java
  • 轉載于:https://my.oschina.net/zhongl/blog/64117

    總結

    以上是生活随笔為你收集整理的定制属于你的HouseMD的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。