为什么Java编译器默认不缩短名称? (性能和混淆)

时间:2013-03-28 09:36:29

标签: java compilation obfuscation

我无法理解为什么Java编译器不会通过用一些唯一的ID替换它们来缩短变量,参数和方法名称的名称。

例如,给定班级

public class VeryVeryVeryVeryVeryLongClass {

    private int veryVeryVeryVeryVeryLongInt = 3;

    public void veryVeryVeryVeryVeryLongMethod(int veryVeryVeryVeryVeryLongParamName) {
        this.veryVeryVeryVeryVeryLongInt = veryVeryVeryVeryVeryLongParamName;
    }
}

编译后的文件包含所有这些非常长的名称:

简单的唯一ID不会加速解析,还会提供第一个混淆吗?

4 个答案:

答案 0 :(得分:10)

您认为总是需要混淆,但不是:

  • 反思会破坏,随之而来的是JavaBeans和许多框架依赖它
  • 堆栈跟踪将变得完全不可读
  • 如果您尝试针对已编译的JAR进行编码,则最终会使用String name = p.a1()而不是String name = p.getName()等代码

当您交付完成的应用程序时,混淆通常是最后一步,即使这样,除非目标平台存在严重的内存限制,否则它不会经常使用。

答案 1 :(得分:4)

使用类时,可以按名称引用其方法。因此,编译器需要保留这些名称。

无论如何,我不明白为什么编译器应该以混淆任何东西为目标。相反,它的目标应该恰恰相反:尽可能透明。

答案 2 :(得分:4)

JVM在内部使用数字ID。

类文件不能像这样混淆,因为Java是动态链接的:成员名称必须是公共可读的,否则其他类不能使用你的代码。

答案 3 :(得分:1)

  

简单的唯一ID不会加快解析速度吗?

没有。它会添加一个可能会降低速度的映射。

  

并提供第一次混淆

是的,但谁想让编译器做混淆购买默认值?不是我。

你的建议没有任何价值。