2012-01-12 4 views
3

私は、クラスファイルのバイトを表すバイトの配列を持っています。クラスがバイト配列の形式である間に、クラスのスーパークラスを決定しますか?

バイト配列で表されるクラスのスーパークラスを取得しようとしています。現在、ClassLoaderクラスの "defineClass"メソッドのリフレクションを使用して、バイト配列で表されるクラスのクラス定義を作成しています。次に、新しく作成されたClassオブジェクトでgetSuperclass()を呼び出してスーパークラスを取得します。

バイト配列で表されるクラスのスーパークラスに基づいて、私はバイトコード変換を実行する必要があります。最後の目標は、変換後にバイト配列によって表されるクラスを再定義することです。

問題は、同じ名前の2つのクラスを同じJVMインスタンスで定義できないため、変換されたクラスを元の名前として再定義できないことです。

実際には、バイト配列で表されるクラスのスーパークラスに基づいて変換を行う必要があり、元の名前で変換されたクラスを再定義する必要があります。

クラスがバイト配列の形式である間にクラスのスーパークラスを取得する方法はありますか? .classファイルのフォーマットに基づいて、私はクラスオブジェクトをクラスオブジェクトとして定義し、それをJVMにロードせずに何とかしてスーパークラスを決定することができると思います。

提案がありますか?

+0

これは実際には動作するのかどうかは考えられませんが、別の名前空間を使用しますか? –

+0

バイトコードを解析するだけです。 –

答えて

3

実行時には単純ではありませんが、新しいクラスローダーでクラスを定義し、スーパータイプを決定し、変換を行い、選択したクラスローダーでクラスを定義します。 (異なるクラスローダーによってロードされたクラスは、実行時に別個のものとみなされます)。

JavassistTutorial)などのクラスファイルを検査できるライブラリを使用するか、抽出コードを自分で書き込んでください(class file specificationを確認してください)。

+0

私は既に使用しているライブラリ:ASMでこれを実現できることを知る前に、あなたの投稿の後半部分(クラスファイルから特定のバイトを読んでスーパークラスを見つけること)を考えていました。答えとしてあなたの回答を選んでいます。私が選ぶ解決策を提示していないにもかかわらず、私の質問に複数の解決策があるからです。レスポンスありがとう! – mburke13

1

私はObjectweb's ASMを使用しましたが、これは使用する最も簡単なAPIの1つではありませんが、おそらく最も高速です。

+1

私はクラスバイトを変換するためにASMを使用しています。ここで言及しましたが、シンプルなClassVisitorを使用してクラスに関する情報をクラスとして定義することなく読むことができます。これを指摘してくれてありがとう! – mburke13

関連する問題