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

标签 java compilation obfuscation

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

例如,给定类

public class VeryVeryVeryVeryVeryLongClass {

    private int veryVeryVeryVeryVeryLongInt = 3;

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

编译后的文件包含所有这些很长的名字:

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

最佳答案

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

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

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

关于java - 为什么 Java 编译器默认不缩短名称? (性能和混淆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678384/

相关文章:

python - 混淆的 mandlebrot 函数 - 有人可以对其进行反混淆吗?

flutter - Flutter代码是否容易进行反向工程而不会引起混淆?

java - beans 的 Spring XML 列表

java - googleMap 上的 addmarker 和 markeroptions 的空指针异常

c++ - 在CMake项目下编译单个文件?

haskell - 使用 GHC API 将 Haskell 源代码编译为 CORE 和 CORE 为二进制

java - token 语法错误 "(", ;预期的

java - Java 类中的 SQL 代码

java - 如何在命令提示符下运行 Java 程序

c++ - 在 C++ 中隐藏敏感字符串的技术