6

我有一个Kitchen.jar文件。我需要修改其中的一个类。我用JD反编译它。然后我修改Toster.java文件并编译它:

javac -classpath . Toster.java

然后我把它带回Kitchen.jar

jar -uf Kitchen.jar Toster.class

除一个问题外,所有工作。Kitchen.jar当我在JD中打开更新时,我看到所有方法中的局部变量都重命名为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用or编译javac -g:vars

来自javac 的文档

-g 生成所有调试信息,包括局部变量。默认情况下,只生成行号和源文件信息。

-g:none不要生成任何调试信息。

-g:{keyword list}仅生成某些类型的调试信息,由逗号分隔的关键字列表指定。有效的关键字是:

source源文件调试信息

lines行号调试信息

vars局部变量调试信息

于 2013-03-12T09:42:48.653 回答
3

变量的名称不会保留在编译的代码中。最明显的是减少编译类的大小。编译器将用较短的名称替换它们。这样做也有利于混淆代码,以便反编译代码的人难以理解逻辑。localLongVar您在 JD 中看到的是编译器对替换的变量名所做的。

于 2013-03-12T09:42:48.583 回答