0

Windows には「インポート ライブラリ」別名「implibs」の概念があります。コードを動的ライブラリにリンクする場合は、.dll 自体に対してリンクするのではなく、.dll を呼び出すサンクを含む特別な静的ライブラリに対してリンクします。 . まあ、それは間違いなく Windows の特異性ですが、場合によっては、その考えはそれほど悪くありません。

たとえば、それぞれ平均 2MB の 100 個の動的ライブラリと、このシステムの 10 個のバージョンで構成される複雑なシステムがあるとします。したがって、すべてのバージョンでこのようなシステムを完全にサポートするために出荷する SDK は、リンクするライブラリだけで 2GB になります。シンボルと小さなサンクのみを含む Implib を使用すると、はるかに少なくなります。

implibs の概念は、通常の Unixish 共有ライブラリに非常に簡単に適用できます。シンボルをダンプし、それらから C で単純なサンクを作成し、コンパイルして、ほら、オリジナルの代わりにそのライブラリにリンクできます。

ここで、同じ考えを Java に拡張したいと思います。したがって、理想的には、jar を取り、その中のバイトコード クラスを書き直してメソッドの本体を削除し、空の (可能な限り) 本体を持つメソッド定義のみを残すツールを探しています。そのようなツールが存在しない場合は、そのようなツールを簡単に作成できる Java バイトコード変換フレームワークへのポインタを探しています。それができない場合は、少なくとも jar からすべてのメソッド シグネチャをダンプできるツールを探して、ネイティブ共有ライブラリの場合と同様のアプローチに従います (当然、空の Java を追加することはできなかったので、より複雑になります)。代わりに、有効な型の値を返す必要があります)。

4

1 に答える 1

1

やりたいことによっては、Krakatauをハックしてこれをかなり簡単に行うことができます。を呼び出す代わりに、 の93 行目method.pyを setに変更するだけです。次に、ジャーを分解して再組み立てします。Krakatau は現在 jar 出力をサポートしていないため、結果のクラスを zip して jar に戻す必要がありますが、それは非常に簡単です。self.code = Noneself._loadCode()

Codeこれにより、バイトコードのみが使用する属性や定数プール エントリを使用せずにクラスが再アセンブルされますが、他のすべては並べ替えまで保持されます。これにより、フィールドやオプションの属性などはそのまま残りますが、コンパイルできるスタブ クラスを作成することが目的の場合は、それらが必要になるでしょう。

コンパイラがコンパイル対象のクラスを実際にロードしようとすると、これは機能しない可能性があることに注意してください。属性が欠落しているためCode、クラスは実際には有効ではなく (最初にバイトコードを含むメソッドが含まれていたと仮定すると)、JVM はそれらのロードを拒否します。

開示:私はクラカタウの作者です。

于 2013-03-30T21:36:55.783 に答える