2012-05-12 18 views
2

私はbyte[]の配列を持っています。クラスファイル内のメソッドのバイトコードシーケンスです。このbyte[]アレイを選択的に逆コンパイルする方法はありますか?私は実際の.classファイルにアクセスできません。 多くのメソッド(javassist.bytecode.CodeAttributeクラス)を持つJavassistライブラリを見ましたが、そのような特定のメソッドを見つけることができませんでした。
誰か手掛かりがありますか?バイトコードの逆コンパイル

私はこのbyte[]配列をとり、JVMリファレンスマニュアルを使って実際のバイトコードをJavaByteコードニーモニックに変換できますが、逆コンパイルされたJavaソースコードを生成する必要があります。 ありがとう!

答えて

3

私は、1つのメソッドのバイトコードを扱うことについて聞いたことがありません。私はあなたがそれで何もできないことが分かると思います。どんなバイトコードがありますか?どこから手に入れましたか? class file formathow methods are storedに精通していますか?たとえば、name of a methodthe constant poolに格納されます。これはクラスファイル全体の一部であり、いずれのメソッドにも属していません。他に何があるのか​​を知るために、メソッド形式についての情報を読んでください。私は非常に強く、あなたがあなたが持っていると思っているものは、byte[]にないと思っています。そうでないと、何かを作るための十分な情報を持っていないでしょう。

免責事項:私はバイトコード操作を手伝っただけなので、私が権威をもっているとは言わないでください。スペックが言っていることを信じてください。

+0

JPDAメソッドのcom.sun.jdi.Method.bytecodes()関数呼び出しからバイトコードを取得しました。私はそれを逆コンパイルして、その関数の逆コンパイルされたバージョンを表示できるようにしたい。問題(例:保護、個人、静的変数などの外部参照)がある可能性があることを理解しています。しかし、私はそれを逆コンパイルする方法があると思っていた。私は自分自身のバイトコードの逆コンパイル方法を書いたので、私はバイトコードから有効なバイトコードを持っています。これは得られたバイトコードからニーモニックを作成します( 'javap'の出力で検証しました)。 – tr4nc3

+0

興味深い。まあ、そこにデコンパイラがあります。私がプログラムAPIを提供していることがわかっているのは、[Java Decompiler](http://java.decompiler.free.fr/)だけです。私はそれがデココンパイラが入力バイトコードに関してどのように柔軟性があるかに依存するだろうと思う。私はJDIを知らないのですが、 'com.sun.jdi.Method'をお持ちの場合は、クラスを表現しているバイトコードの情報を得ることができます。おそらく 'method.declaringType()'のようなもので、[ClassType](http://docs.oracle.com/javase/6/docs/jdk/api/jpda/jdi/com/sun/jdi/)を提供するはずです。 ClassType.html)? –

+0

右の 'Method.declaringType()'は 'ReferenceType'オブジェクトのみを与えます。そのオブジェクトからバイトコードを取得する方法はありません。 'sourcePath()'と 'sourceName()'関数呼び出しがありますが、ソースのファイル名を取得するかもしれませんが(ソースがあると仮定して)、ほとんどの場合そうではないかもしれません最初は逆コンパイラ)。私は、JD-Eclipseの人たちがプログラム的なAPIを提供しているかどうかはわかりません。私は彼らがEclipseのために持っていると信じています。また、クローズドソースなので、ライセンスごとに許可されていないリリースファイルを元に戻しています。 – tr4nc3

2

特に、特定のメソッドのバイトコードのみを使用して有効なJavaソースを生成することは不可能です。これは、すべての名前がクラスワイド定数プールに格納されているためです。あなたが望むことができる最高のものは、バイトコードニーモニックを生成することです。

関連する問題