6

ファイルがありKitchen.jarます。その中のクラスを変更する必要があります。JDで逆コンパイルします。次に、Toster.javaファイルを変更して、次のコマンドでコンパイルします。

javac -classpath . Toster.java

そして、私はそれをで戻しますKitchen.jar

jar -uf Kitchen.jar Toster.class

1つの問題を除いてすべてが機能します。JDでupdatedを開くKitchen.jarと、すべてのメソッド内のローカル変数の名前が。のように変更されていることがわかります。なんで?localLongVar

私が尋ねる理由はKitchen.jar、変更後に働くことを拒否するからです。そして、それはコンパイルの問題であるに違いないと思います。多分私はいくつかの旗か何かを誤用しました。わからない。基本的な構文を除いて、Javaの知識はまったくありません。

私の推測では、最新の1.7バージョンでコンパイルし、元のjarは古いJDKでコンパイルしています。それは操作の失敗を説明するかもしれませんが、それは地元の人々の名前の変更を説明していません。

元のjarからのランダムな行:

BigInteger[] result = new BigInteger[bis.length / 2];

そして、私のクラスとまったく同じ行:

BigInteger[] arrayOfBigInteger1 = new BigInteger[paramArrayOfBigInteger.length * 2];

だからそのresultarrayOfBigInteger1

4

2 に答える 2

5

デフォルトでは、javac はソース ファイルと行番号以外のデバッグ情報を削除します。javac -gまたはでコンパイルしjavac -g:varsます。

javacのドキュメントから

-g ローカル変数を含むすべてのデバッグ情報を生成します。デフォルトでは、行番号とソース ファイル情報のみが生成されます。

-g:noneデバッグ情報を生成しません。

-g:{keyword list}コンマで区切られたキーワードのリストで指定された、ある種のデバッグ情報のみを生成します。有効なキーワードは次のとおりです。

sourceソースファイルのデバッグ情報

lines行番号デバッグ情報

varsローカル変数のデバッグ情報

于 2013-03-12T09:42:48.653 に答える
3

変数の名前は、コンパイルされたコードでは保持されません。コンパイルされたクラスのサイズを減らすことが最も明白です。コンパイラはそれらを短い名前に置き換えます。これを行うことは、コードを難読化するのにも適しているため、コードを逆コンパイルする人がロジックを理解するのに問題が生じます。JD で表示されるlocalLongVarは、置き換えられた変数名からコンパイラが作成するものです。

于 2013-03-12T09:42:48.583 に答える