Zorka源碼閱讀與講解(1)怎樣實現插樁?,zorka源碼

來源:互聯網
上載者:User

Zorka源碼閱讀與講解(1)怎樣實現插樁?,zorka源碼

從這篇部落格開始,我會陸續介紹和總結一些自己認為Zorka源碼中重要的部分,也協助大家學習Java instrumentation之類的一些基本知識(其實對我自己來說也是個學習的過程)

可能大家最關心的,還是Zorka是怎樣實現插樁(Instrumentation)的,所以這篇日誌就簡單講講這個,也順便介紹一些閱讀和學習開源項目的通用方法。

首先我們可以在這裡:https://github.com/jitlogic/zorka下載其Master branch的壓縮包,但是解壓以後發現很複雜,這時候怎麼快速入門呢,有一種方法:我們用壓縮軟體開啟zorka.jar這個JAR包,然後查看META-INF下的MANIFEST.MF檔案,可以看到中間有一行:Premain-Class: com.jitlogic.zorka.agent.AgentMain 這可以認為是Zorka的入口方法。我們將Zorka的源碼匯入Eclipse中(注意這個項目是基於Maven的,基於Maven的項目匯入Eclipse,請參考我這篇日誌)。然後開啟上面這個類。可以看到這個類的一個方法是:public static void premain

其注釋寫著:This is entry method of java agent. 所以就應該從這裡看起了。關於這個方法為什麼叫premain,具體原因有很多人解釋過了,例如這裡:http://blog.csdn.net/zhyhang/article/details/17027441 ,

我們可以看到,這個方法開始之後,Zorka Agent做了一些讀取設定檔,產生instance的過程,具體細節這裡就不介紹了,主要看看這部分代碼:

if (instance.getConfig().boolCfg("spy", true)) {    addTransformer(instrumentation, instance.getClassTransformer(), retransformSupported);    MainSubmitter.setSubmitter(instance.getSubmitter());    MainSubmitter.setTracer(instance.getTracer());}

簡單來說,addTransformer這個方法用Reflection實現了插樁的目的,具體的細節大家可以查查其他的資料,我們需要關心的就是,這個instrumentation對象到底是什麼東西?按照Zorka注釋裡的介紹,instrumentation reference to JVM instrumentation interface,instrumentation本身是一個介面:http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html 說到這裡,插一點題外話,實際上都可以通過Eclipse看到JDK的部分源碼,具體的方法可以參考這裡:http://blog.csdn.net/bruce128/article/details/6887732,這個介面中有一個方法叫:addTransformer 可以通過這個方法註冊一個ClassFileTransformer,對於Zorka來講,instance.getClassTransformer()這個方法就可以返回一個它自己實現的ClassFileTransformer的執行個體化類,我們具體看看這個方法:

public synchronized SpyClassTransformer getClassTransformer() {    if (classTransformer == null) {        classTransformer = new SpyClassTransformer(getSymbolRegistry(), getTracer(),            getConfig().boolCfg("zorka.spy.compute.frames", true), stats, getRetransformer());    }    return classTransformer;}

很顯然,接下來看看SpyClassTransformer這個類就知道怎麼回事了。SpyClassTransformer implements ClassFileTransformer 可以看到,這個類確實執行個體化了ClassFileTransformer這個介面。這個介面中只定義了一個public byte[] transform方法,我們需要去執行個體化它。我們簡單看看這個方法,基本上就搞清楚Zorka instrumentation的入口了。

簡單說一下這個方法中的這兩句:

ClassReader cr = new ClassReader(cbf);ClassWriter cw = new ClassWriter(cr, doComputeFrames ? ClassWriter.COMPUTE_FRAMES : 0);

在這裡就使用了ASM的一些功能。具體細節我就不介紹了。關於介紹的java.lang.instrument這個包的簡單使用例子,感興趣的朋友可以看看我很久之前寫過的一篇部落格:http://www.cnblogs.com/quyu/archive/2011/12/14/2287742.html,還附帶有一個簡單的例子。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.