我有一个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
。
答案 0 :(得分:5)
默认情况下,javac会删除源文件和行号以外的调试信息。使用javac -g
或javac -g:vars
进行编译。
-g
生成所有调试信息,包括局部变量。默认情况下,仅生成行号和源文件信息。
-g:none
不生成任何调试信息。
-g:{keyword list}
仅生成某些类型的调试信息,这些信息由逗号分隔的关键字列表指定。有效的关键字是:
source
源文件调试信息
lines
行号调试信息
vars
本地变量调试信息
答案 1 :(得分:3)
变量的名称不会保留在已编译的代码中。最明显的是减少编译类的大小。编译器将用更短的名称替换它们。这样做也有助于混淆代码,以便反编译代码的人有理解逻辑的问题。您在JD中看到的localLongVar
是编译器对替换变量名称的作用。