2011-11-18 25 views
1

在運行時獲得與所有類相關的二進制數據的一些方法是java字節碼(我想將數據寫入磁盤)。獲取與類相關聯的二進制數據的Java程序化方法

而我不想使用JMX。

基本上,我試圖檢測一個類的問題,我想把類從運行字節碼放在磁盤上。

  1. 是否有從類加載器運行的所有類的列表?

  2. 如何獲取該列表?

  3. 一旦我得到一個類的列表,我可以使用什麼代碼來提取字節碼數據?

+0

這個可能的重複:http://stackoverflow.com/questions/4130903/java-getting-bytecode-of-class-at-runtime-from-within-the-same-jvm –

+0

我可以加載一個類一次。但是我想要一個在運行時加載的所有類的列表。 –

+0

如果你有自己的裝載機,你可以逐個完成所有的類。 –

回答

1

就像Stephen C說的那樣,-verbose選項可以使列表跟蹤加載的類。 如果你想提取類文件,也許你可以使用java.lang.instrument來獲取類文件。它僅用於檢測java字節碼。

的基本方法如下:

儀表的最大作用,是動態變化和操作的定義。開發人員可以通過一個普通的Java程序(具有Java的主要功能)運行通過-javaagent參數指定特定的jar文件(包括Instrumentation Agents)來啓動Agent Instrumentation。 總結說,是下面的步驟:

  • 準備的premain功能

    一個Java類,它包含的任何一個 公共靜態無效倍美力的以下兩種方法(字符串agentArgs,儀器儀表研究所)的製備, [1] public static void premain(String agentArgs),[2]

    package sample.verboseclass;

公共類主要{ 公共靜態無效倍美力(字符串指定參數時,儀器儀表研究所){ ... } }

其中,高優先級[1] [2]級別將執行([1]和[2]同時,法院被忽視[2]) 。 在這個前置功能中,開發人員可以執行此類操作。 AgentArgs是過程參數的前置功能,伴隨着「-javaagent」一起出現。和主函數不同的是,這個參數是一個字符串而不是一個字符串數組,如果一些程序的參數,程序會自行解析字符串。 Inst是從JVM自動導入的java.lang.instrument.Instrumentation示例。 Java.lang.instrument.Instrumentation儀器包是一個接口的定義,是這個包的核心部分,它集中了幾乎所有的功能,例如類型轉換和操作的定義等等。你必須實現這個接口

package sample.verboseclass;

公共類主要{

public static void premain(String args, Instrumentation inst) { 
    inst.addTransformer(new Transformer()); 
} 

}

級變壓器實現ClassFileTransformer {

public byte[] transform(ClassLoader l, String className, Class<?> c, 
     ProtectionDomain pd, byte[] b) throws IllegalClassFormatException { 
    System.out.print("Loading class: "); 
    System.out.println(className); 
    return b; 
} 

}

  • Jar文件打包

    此Java類將打包成一個jar文件,並且通過將「Premain-Class」添加到使用預先設定的Java類準備的指定步驟來清楚顯示屬性。 (可能還需要指定其他屬性,打開更多的功能)

    清單-版本:通過與Java以下儀表sample.verboseclass.Main

  • 操作

    運行:1.0 倍美力級節目: Java的javaagent:JAR文件位置[=進口的倍美力參數]

在你的項目,你可以寫代碼在中提取字節碼ClassFileTransformer方法,該方法將傳遞加載的拜讀碼加載器。

2

我有,你應該能夠實現自己的類加載器記錄了加載和,因爲他們正在加載捕捉他們的字節碼文件中的類來做到這一點的感覺。但事後做這件事會困難得多。

除非您嘗試對加密應用程序(tsk,tsk)進行反向工程/破解,否則可能有更好的方法來「檢測問題」。你爲什麼不告訴我們你在做什麼真的


如果你只是想爲已加載的類的列表,啓動JVM與-verbose:class選項集。

相關問題