2

コンパイル済みの jar を使用するプログラムをデバッグしています。あるクラスの関数に対する呼び出しをログに記録したいと考えています。元のクラス ファイル Xxx.class の名前を Xxx0.class に変更し、元のクラス名を次のように定義します。

class Xxx extends Xxx0 {
    void func() {
        Log.d(...);
        super.func();
    }
}

何か案は?

(私は逆コンパイラを試しました: 逆コンパイルされたコードには奇妙な制御構造があります.逆コンパイラはおそらくこのプログラムの正しいコードを生成しません.)

4

7 に答える 7

1

クラスの名前は、ロード時にクラス ファイルの名前を計算するために使用されるだけでなく、クラスの名前もクラス ファイルに保存され、一致する必要があるため、クラス ファイルの名前を変更することはできません。要求されたクラス。

したがって、クラスの名前を変更する場合は、ソース コードで名前を変更して再コンパイルする必要があります。

于 2013-03-19T07:09:29.780 に答える
1

クラス ant の名前を変更したい場合、ソースの Java ファイルがない場合は、次の手順を実行します。

i) 最初に jd (Java 逆コンパイラ) でファイルを開き、ソース ファイルを保存 (Ctrl+S) します。
ii) Java ファイルの名前を変更し (F2)、Java ファイル内のクラス名も変更します。
iii) Java ファイルを (任意の Java コンパイラを使用して) .class ファイルに再度コンパイルします。

これで問題が解決します。
これを試して、懸念がある場合はお知らせください。

注: Java デコンパイラで問題が発生している場合は、別のバージョンの JD で試してください。
最新のJDをダウンロードするには、ここにアクセスしてください

于 2013-03-19T07:21:28.160 に答える
0

.class ファイルは java の public クラスとリンクされているため (同じように) 名前を変更することはできません。.class ファイルの名前を変更した場合でも、クラスの名前も変更する必要があります。そうしないと、エラーが発生します。

コンパイルすると (.java から .class) バイトコードに変換されるため、クラス ファイルの名前を変更した場合、バイト コードを直接変更することはできませんが、decompiler(reflection を使用して .class ファイルを .java に再度変換することはできます) )、パブリッククラス名を変更したファイル名に変更し、再度ビルドして使用します。

.class を .java に簡単に変換でき、80% 変換できる多くの逆コンパイラを利用できます。

于 2013-03-19T07:14:29.920 に答える
0

Java クラス ファイルの名前を自由に変更しないでください。これを行うと、編集したクラス ファイルはエラーのために二度と使用できなくなります。これは、クラス ファイルの名前が Java クラス名に対応しているためです。

これで、Eclipse で .class ビューアーを使用して、.class ファイルに示されている Java コードをコピーするだけで済みます。別の .java ファイルを作成し、クラス名を必要なファイル名に変更します。.java ファイルをコンパイルし、対応する .class を見つけます。

これで、.class の名前が正常に変更されました。

ただし、欠点があります。影響を受ける他のクラスへの変更を必ず反映してください。

于 2013-03-19T07:41:08.193 に答える
0

ASMのようなバイトコード操作ライブラリを使用して、クラスの名前を変更しますVisitor

ただし、独自の代替手段を提供したとしても、他の型の型への参照を更新する必要があるかどうかはわかりません-合成アクセサーはサブタイプに変換されますか?

目的がロギングである場合、型を置き換えるよりも複雑でない方法があります。メソッドを上記のようにAOPまたはバイトコード操作でインストルメント化します。

于 2013-03-19T08:45:10.727 に答える
-1

これは、アスペクト指向プログラミングの古典的なタスクです。たとえば、アスペクト指向の Android 開発 – ツール統合を参照してください。

于 2013-03-20T06:57:27.030 に答える