2

バイトコード バージョン X の Java クラス ファイル (ClassName.class) が与えられた場合、このクラス ファイルをバイトコード バージョン X で表されるものからバイトコード バージョン Y で表されるものに変換する一般的な方法はありますか?

仮定:

  • ソースコードは利用できません。クラス ファイルは、クラスの唯一の利用可能な表現です。
  • クラス ファイルは非常に難読化されているため、jad などのプログラムでクラスを逆コンパイルし、"-target ..." で再コンパイルしても機能しません。

最初の投稿後の更新:

  • 更新 #1: さらに、バイトコード バージョン X とバイトコード バージョン Y が十分に近いため、クラス (現在はバイトコード バージョン X) で使用されるすべての命令もバージョン Y に存在すると仮定します。
4

4 に答える 4

3

ダウングレードについては、Java 5/6 コードを Java 1.3/1.4 で実行するためのさまざまな方法を確認できます。関連する質問Backport Java 5/6 features to Java 1.4? への回答を参照してください。

于 2009-10-01T08:21:22.263 に答える
2

Apache BCELを使用できます

バイト コード エンジニアリング ライブラリは、(バイナリ) Java クラス ファイルを分析、作成、および操作するための便利な機能をユーザーに提供することを目的としています。

BCEL を使用すると、特定のバージョンのクラス ファイルを読み込んで操作し、新しいクラス ファイル ストリームを生成してから、低レベルClassLoaderAPI を使用してそれを VM にロードできます。非常に手間がかかることは間違いありません。これにより、バージョンをアップグレードするのと同じくらい簡単にバージョンをダウングレードできるとは思えません。

于 2009-10-01T07:40:50.130 に答える
1

レトロウィーバーを使用する

于 2009-11-19T16:33:35.663 に答える
1

いいえ。Java の新しいバージョンではそのバイトコードを実行できますが、アップグレードすることはできません。クラス ファイルの新しいバージョンは異なる形式になっています。

古いバージョンの Java では、欠落しているバイトコードを他の構造体で置き換える方法がないため、ダウングレードすることもできません。

[編集] IIRC、Sun は、Java のメジャー バージョンごとに少なくとも 1 つの新しいバイトコード命令を追加しました。これは通常、メジャーな Java リリースの理由です: バイトコードへの変更。

とはいえ、運試しとしてクラス ファイルのメジャー バージョンを変更し、新しい VM がそれをロードするかどうかを確認してください。複雑な例でうまくいくとは思えませんが、幸運かもしれません。

于 2009-10-01T07:41:08.773 に答える