定制属于你的HouseMD
2019獨角獸企業重金招聘Python工程師標準>>>
沒有比新增一些更酷的指令, 更讓人興奮的啦~
要辦到它, 得從下面的類入手.
Command
像env?這樣不需要用到Instrumentation指令, 可以直接繼承Command, 將自定義指令的邏輯實現在run方法中.
切記, 指令只能有一個構造器, 因為只有第一個構造器會被用于實例化指令; 并且, 構造器應至少有一個參數是PrintOut, 用以Command的初始化, 它是用來向控制臺回顯信息的. 不用擔心如何構造一個PrintOut的實例, 只用留好這個參數,?HouseMD會幫我們搞定.
每個指令是如何被執行的呢?
典型的過程是:
如何聲明參數選項
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) 剩下你需要做的是:
細節請參考代碼作為示例:
- Trace.scala
- Inspect.java
Completer
要想自定義的指令具備良好的交互體驗, 那么支持參數自動補全這個功能一定要提供. 實現這點就需要實現Completer接口的complete方法, 具體怎么做, 文字不好描述, 還是看源碼吧.
不要忘了最后一步
新增的指令需在House中agentOptions的值(:: Nil之前)增加一下, 現在方式有點土, 歡迎高手來改進它.
更多相關疑問請提交Issue, 我們一起來討論:)
完整開發文檔請見這里?
參考資料
轉載于:https://my.oschina.net/zhongl/blog/64117
總結
以上是生活随笔為你收集整理的定制属于你的HouseMD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRM 客户关系管理
- 下一篇: mysql数据库引擎调优