定制属于你的HouseMD
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
沒有比新增一些更酷的指令, 更讓人興奮的啦~
要辦到它, 得從下面的類入手.
Command
像env?這樣不需要用到Instrumentation指令, 可以直接繼承Command, 將自定義指令的邏輯實(shí)現(xiàn)在run方法中.
切記, 指令只能有一個(gè)構(gòu)造器, 因?yàn)橹挥械谝粋€(gè)構(gòu)造器會(huì)被用于實(shí)例化指令; 并且, 構(gòu)造器應(yīng)至少有一個(gè)參數(shù)是PrintOut, 用以Command的初始化, 它是用來向控制臺(tái)回顯信息的. 不用擔(dān)心如何構(gòu)造一個(gè)PrintOut的實(shí)例, 只用留好這個(gè)參數(shù),?HouseMD會(huì)幫我們搞定.
每個(gè)指令是如何被執(zhí)行的呢?
典型的過程是:
如何聲明參數(shù)選項(xiàng)
Command提供了三種方法來實(shí)現(xiàn)聲明:
- flag?聲明布爾類型的選項(xiàng), 通常用于開啟什么模式或特定的動(dòng)作, 例如loaded指令的-h選項(xiàng)
- option?聲明除布爾類型之外的單值選項(xiàng), 選項(xiàng)是必須有默認(rèn)值的, 例如trace的-p選項(xiàng)
- parameter?聲明參數(shù),
- 可以聲明多個(gè)參數(shù), 輸入的順序與聲明的順序一致
- 可以是單值或多值, 多個(gè)參數(shù)的情況下, 只允許最后一個(gè)參數(shù)是多值
- 可以設(shè)定默認(rèn)值, 不設(shè)的話表明必須要輸入?yún)?shù).
請(qǐng)確保參數(shù)選項(xiàng)的聲明, 使用在聲明屬性的位置完成的, 目的是為了保證在執(zhí)行Command的parse方法之前, 所有的聲明已完成.
細(xì)節(jié)請(qǐng)參考代碼作為示例:
- Loaded.scala
- Trace.scala
- Env.java
- Inspect.java
沒有Instrumentation的Command實(shí)現(xiàn)能做什么?
運(yùn)行在目標(biāo)進(jìn)程的環(huán)境中, 很多JVM提供的工具方法就可以拿來了:
- 像env, 就是通過java.lang.System.getenv()來實(shí)現(xiàn)查看目標(biāo)進(jìn)程的系統(tǒng)環(huán)境變量( 順便提一下, 我刻意沒有實(shí)現(xiàn)查看Properities的功能, 留給大家練手用 :D )
- 還可以利用java.lang.management.ManagementFactory獲得系統(tǒng)提供的管理Bean, 來實(shí)現(xiàn)諸如: 查看線程數(shù), 內(nèi)存, 執(zhí)行Full GC等等
總之, 發(fā)揮你的想象力, 指令可以運(yùn)行在目標(biāo)進(jìn)程中了, 還有什么可以直接拿來用的呢?
Instrumentation
若是要用到Instrumentation的指令, 也同樣要繼承Command, 與?env, 但構(gòu)造器就要多一個(gè)Instrumentation的參數(shù), 如loaded.?HouseMD在實(shí)例化指令的時(shí)候, 會(huì)將Instrumentation的實(shí)例傳入.
指令的構(gòu)造器最多就Instrumentation和PrintOut兩個(gè)參數(shù), 多了會(huì)導(dǎo)致實(shí)例化失敗.
TransformCommand
要實(shí)現(xiàn)一個(gè)比trace更牛逼的指令, 前面的方法已經(jīng)足夠讓你辦到了. 但我還是強(qiáng)烈推薦繼承TransformCommand, 它已經(jīng)幫你實(shí)現(xiàn)了字節(jié)碼增強(qiáng)的部分(這部分是有很多陷阱的, 除非你有足夠的經(jīng)驗(yàn), 真的如此我熱切的希望你能幫我改進(jìn)它), 還有常規(guī)選項(xiàng)(如-i,-t,-l以及-p) 剩下你需要做的是:
細(xì)節(jié)請(qǐng)參考代碼作為示例:
- Trace.scala
- Inspect.java
Completer
要想自定義的指令具備良好的交互體驗(yàn), 那么支持參數(shù)自動(dòng)補(bǔ)全這個(gè)功能一定要提供. 實(shí)現(xiàn)這點(diǎn)就需要實(shí)現(xiàn)Completer接口的complete方法, 具體怎么做, 文字不好描述, 還是看源碼吧.
不要忘了最后一步
新增的指令需在House中agentOptions的值(:: Nil之前)增加一下, 現(xiàn)在方式有點(diǎn)土, 歡迎高手來改進(jìn)它.
更多相關(guān)疑問請(qǐng)?zhí)峤籌ssue, 我們一起來討論:)
完整開發(fā)文檔請(qǐng)見這里?
參考資料
轉(zhuǎn)載于:https://my.oschina.net/zhongl/blog/64117
總結(jié)
以上是生活随笔為你收集整理的定制属于你的HouseMD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRM 客户关系管理
- 下一篇: JNDI实现连接池