为什么我编译的类重命名了它的方法局部变量?



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

javac -classpath . Toster.java

然后我用

把它带回到Kitchen.jar
jar -uf Kitchen.jar Toster.class

除了一个问题,其他都可以。当我在JD中打开更新的Kitchen.jar时,我看到所有方法中的局部变量都重命名为localLongVar之类的东西。为什么?

我问的原因是Kitchen.jar在修改后拒绝工作。我怀疑这一定是编译问题。也许我用错了旗子什么的。不确定。除了基本的语法外,我对Java一无所知。

我的猜测是我用最新的1.7版本编译它,而原始的jar是用旧的JDK编译的。这可以解释操作失败的原因,但不能解释局部变量的重命名。

原始jar中的随机行:

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

和我的class的同一行:

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

所以是result vs arrayOfBigInteger1

默认情况下,javac删除除源文件和行号以外的调试信息。使用javac -gjavac -g:vars编译

取自javac的文档

-g生成所有调试信息,包括本地变量。缺省情况下,只生成行号和源文件信息。

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

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

source源文件调试信息

lines行号调试信息

vars本地变量调试信息

在编译后的代码中不保留变量的名称。最明显的是减少编译类的大小。编译器将用更短的名称替换它们。这样做还有助于混淆代码,以便反编译代码的人在理解逻辑时遇到问题。您在JD中看到的localLongVar是编译器对替换的变量名的处理。

最新更新