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

时间:2013-03-12 09:39:24

标签: java javac

我有一个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];

我班上的同一行:

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

所以它是result vs arrayOfBigInteger1

2 个答案:

答案 0 :(得分:5)

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

来自documentation of javac

  

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

     

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

     

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

     

source源文件调试信息

     

lines行号调试信息

     

vars本地变量调试信息

答案 1 :(得分:3)

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