4

私がこのクラスを持っているとしましょう:

public class class1 extends Applet implements Runnable
{
    private String s;
    private URL u;
    ...
}

そして2番目のクラス:

class TS extends Thread
{
    private final class1 _$97913;
    public TS(class1 paramclass1)
    {
        this._$97913 = paramclass1;
    }
    ...
    public void PostData()
    {
        ...
        class1.access$16(this._$97913, new Socket(class1.access$17(this._$97913), 80);
        ...
    }
    ...
}

誰かがclass1から どのようclass1.access$16(this._$97913, new Socket(class1.access$17(this._$97913), 80);に参照しているのか説明できますか?private URL u;

どこaccess$16から来たの?これは何と呼ばれ、どこでそれについてもっと知ることができますか?

さて、これは逆コンパイルされたコードの結果ですが、数値(、、など)を元の変数またはクラスに関連付ける方法はありaccess$16ますaccess$17か?私が見ることができることから、唯一の方法は手動で行うことです(つまり、どこで参照されているかを確認し、「this」クラスがURLを受け取ったので、「this」は「that」変数に関連付けられている必要があると推測します)?

4

2 に答える 2

5

これはJavaを逆コンパイルした結果ですか?

これは、外部クラスと内部クラスが互いのプライベートフィールドまたはメソッドにアクセスできるようにするために作成された合成メソッドのように見えます。

Javaコンパイラは、プライベート修飾子で指定された属性がそれを囲むクラスによってアクセスされるときに、ネストされたクラスに合成メソッドを作成する必要があります。次のコードサンプルは、この状況を示しています。

..。

上記の画面スナップショットが示すように、access $ 100という名前の合成メソッドが、ネストされたクラスNestedClassに作成され、そのプライベート文字列を囲んでいるクラスに提供します。合成メソッドは、囲んでいるクラスがアクセスするNestedClassの単一のプライベート属性に対してのみ追加されることに注意してください。

于 2011-04-02T16:27:21.290 に答える
4

さて、これは逆コンパイルされたコードの結果ですが、数値(、、など)を元の変数またはクラスに関連付ける方法はありaccess$16ますaccess$17か?私が見ることができることから、唯一の方法は手動で行うことです(つまり、どこで参照されているかを確認し、「this」クラスがURLを受け取ったので、「this」は「that」変数に関連付けられている必要があると推測します)?

メソッドは、access$xネストされたクラスから(またはその逆、またはネストされたクラスから別のクラスへ)プライベートメソッドまたは変数にアクセスする場合に作成されます。VMはプライベート変数への直接アクセスを許可しないため、これらはコンパイラによって作成されます。

逆コンパイラーがこれらのメソッド呼び出しをusingクラスの再作成されたソースコードにとどまらせる場合、合成メソッド定義も使用されたクラスの再作成されたソースコードにとどまらせる必要があります。もしそうなら、問題のメソッドの受信者であるクラスを見てください(class1あなたの場合)、そのようなメソッドがあるはずです(access$17)。このメソッドのコードでは、ここでアクセスされる実際のメソッド(または変数)を確認できます。

デコンパイラーが合成メソッドを削除した場合、これはバグであるか、構成可能である可能性があります。また、すべてのクラスを一度に渡す必要がある場合もあります。そうすれば、どこにでも適切なメソッド/フィールドを配置できます。ドキュメントを参照してください。


メソッド呼び出しのドットの前にクラス(および存在する場合はそれらのスーパークラス)がある場合は、メソッドが必要です。

投稿したスニペットから、にaccess$16メソッドaccess$17が含まれている必要がありますclass1(またはclass1ここにローカル変数がありますか?)。

そうでない場合は、逆コンパイラーがより賢くなろうとしたのかもしれません。の出力javap class1を見て、メソッドが存在するかどうか、およびjavap -c class1バイトコード全体を確認できます。または、別の逆コンパイラを使用します。

于 2011-04-02T18:19:46.300 に答える