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

Alp*_*aaa 3 java obfuscation compilation

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

例如,给定课程

public class VeryVeryVeryVeryVeryLongClass {

    private int veryVeryVeryVeryVeryLongInt = 3;

    public void veryVeryVeryVeryVeryLongMethod(int veryVeryVeryVeryVeryLongParamName) {
        this.veryVeryVeryVeryVeryLongInt = veryVeryVeryVeryVeryLongParamName;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

gus*_*afc 10

您假设总是需要混淆,但它不是:

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

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

  • 它不能使用符号表吗?并根据请求检索它们(例如,在编译时,反射,堆栈跟踪) (2认同)