3

我不明白为什么 Java 编译器不通过用一些唯一的 ID 替换它们来缩短变量、参数、方法名称的名称。

例如,给定类

public class VeryVeryVeryVeryVeryLongClass {

    private int veryVeryVeryVeryVeryLongInt = 3;

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

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

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

4

4 回答 4

10

您假设始终需要混淆,但事实并非如此:

  • 反射会中断,JavaBeans 和许多依赖它的框架也会随之中断
  • 堆栈跟踪将变得完全不可读
  • 如果您尝试针对已编译的 JAR 进行编码,您最终会得到类似的代码,String name = p.a1()而不是String name = p.getName()

当您交付完成的应用程序时,混淆通常是最后一步,即使这样,它也不会特别频繁地使用,除非目标平台有严重的内存限制。

于 2013-03-28T09:38:24.617 回答
4

当你使用一个类时,你通过它们的名字来引用它的方法。因此,编译器需要保留这些名称。

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

于 2013-03-28T09:39:09.870 回答
4

JVM 在内部确实使用数字 ID。

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

于 2013-03-28T09:40:26.243 回答
1

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

不,它会添加一个可能会减慢它的映射。

并且还提供了第一个混淆

是的,但谁希望编译器做混淆购买默认?不是我。

你的建议没有任何价值。

于 2013-03-28T22:44:08.110 回答