5

実行中のJavaクラスのソースコードを動的に表示するツールを作成しています。Class Objectソースコードのtoから動的に逆コンパイルするのに役立つツールが必要ですString。Jadのようないくつかの逆コンパイルツールを知っています。DJ逆コンパイラは.classファイルを逆コンパイルできますが、ツールは次のことができると思います。

Class<?> c = ..; // get from runtime environment
String sourcecode = **DecompileTool**.decompileClassObject(c);
return sourcecode;

私はそのようなDecompileToolが必要です、誰もが知っていますか?ありがとう

4

4 に答える 4

3

私はそのように使用できる逆コンパイラーを知りません。

実際、一般的なケースでは、次のように機能する逆コンパイラーを実装することはできません。

  • ランタイムから取得するClass<?>オブジェクトは、バイトコードにアクセスする方法を提供しません。

  • バイトコードを取得するには、クラスパスから「.class」ファイルを見つけたときにクラスローダーが行うことをやり直す必要があります。

  • 動的にインスタンス化されたクラスローダーの可能性を含めると、使用されているクラスローダーを見つける方法はないと思います。(そして、そのようなクラスローダーは、(たとえば)Webコンテナーでは通常の方法です。)

  • 一般的なケースでは、クラスローダーは、リバースエンジニアリングを行わずに同じロジックを逆コンパイラーアダプターコードにハードコーディングしない限り、再現できない方法でそれを実行します。

さらに、逆コンパイラーがコンパイルできないソースコードを生成する可能性が非常に高いため、これをその場で行うことはおそらく無意味です。

于 2012-07-02T03:47:14.513 に答える
2

これらの逆コンパイラのいずれも、このタイプの醜いインターフェースをサポートしているとは思いません。

まず第一に、ほとんどの逆コンパイラーは、実際のコンパイラーと同様の形式でコードを表すため、抽象構文木です。運が良ければ、逆コンパイラーにインターフェースがあれば、おそらくこのタイプになります。String逆コンパイラーを作成する人は、コードをどのようにフォーマットするかについてどのように考えているので、rawを返すことは満足のいくものではありません(逆コンパイルの最大の課題の1つは、結果をユーザーに提示することです!)。

代わりに、これを適切に行う小さなラッパーを作成する必要があります。逆コンパイルが必要なファイルをその場で生成し、逆コンパイラーを介して送信し、結果を文字列に抽出します(すぐに取得できます)。巧妙なフォークやパイピングなどを行う場合でも、実際には、逆コンパイラの出力ファイルをフォーマットしたいだけです。)

于 2012-07-02T03:40:56.150 に答える
0

Cavaj Java Decomplierを試してみてください。これは便利な場合があります。これに満足できない場合は、EclipseIDEでJadClipseを試してください。

于 2012-07-02T04:15:29.250 に答える
0

次の手順を実行できます

1)次のようなコードを逆コンパイルするために利用可能な逆コンパイラを使用できます

Process p = Runtime.getRuntime().exec("jad /location/CompilesClass.class");
BufferedReader in = new BufferedReader(  
    new InputStreamReader(p.getInputStream()));  
String line = null;  
while ((line = in.readLine()) != null) {  
    System.out.println(line);  
}  

.jad2)これで、コンパイルされたクラスは、クラスファイルがあったパスで拡張子(ソースコード)に変換されます

3)これで、JDK6のクラスごとにその.jadファイルを読み取ることができます。Scanner好き

        Scanner scanner = new Scanner(new File("locationOfJADFIle")).useDelimiter("\n");

        while(scanner.hasNext()){
            System.out.println(scanner.next());
        }
于 2012-07-02T04:16:09.697 に答える