天天看點

從Java程序裡dump出類的位元組碼檔案

想要檢視一些被增強過的類的位元組碼,或者一些AOP架構的生成類,就需要dump出運作時的Java程序裡的位元組碼。

從運作的java程序裡dump出運作中的類的class檔案的方法:

用agent attatch 到程序,然後利用Instrumentation和ClassFileTransformer就可以擷取到類的位元組碼了。

用sd-jdi.jar裡的工具。sd-jdi.jar裡自帶的的sun.jvm.hotspot.tools.jcore.ClassDump就可以把類的class内容dump到檔案裡。

ClassDump裡可以設定兩個System properties:

sun.jvm.hotspot.tools.jcore.filter           Filter的類名

sun.jvm.hotspot.tools.jcore.outputDir    輸出的目錄

sd-jdi.jar 裡有一個sun.jvm.hotspot.tools.jcore.PackageNameFilter,可以指定Dump哪些包裡的類。PackageNameFilter裡有一個System property可以指定過濾哪些包:sun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList。

可以通過這樣子的指令來使用:

sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" -Dsun.jvm.hotspot.tools.jcore.filter=sun.jvm.hotspot.tools.jcore.PackageNameFilter -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=cn.sf  sun.jvm.hotspot.tools.jcore.ClassDump

使用起來比較麻煩。在sa-jdi.jar裡,還有一個圖形化的工具HSDB,也可以用來檢視運作的的位元組碼。sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB