java-8 - javac -parameters 标志的缺点

标签 java-8 javac

我想尝试一些在运行时需要参数名称的框架功能,所以我需要使用 -parameters 编译我的应用程序,它会将参数名称存储在 JVM 字节码中。

除了 jar/war 的大小之外,这个参数的使用还有哪些缺点?

最佳答案

将参数名称添加到类文件格式中包含在 JEP 118 中,它是在 Java 8 中交付的。关于为什么在 OpenJDK 电子邮件线程中包含参数名称是可选的,有一些讨论 herehere .简而言之,将参数名称设为可选的原因是对类文件大小、兼容性表面和敏感信息暴露的担忧。

兼容性表面的问题值得一些额外的讨论。上面链接的线程之一说更改参数名称是二进制兼容的更改。这是事实,但仅在 JVM 的二进制兼容性概念的严格上下文中。也就是说,更改方法的参数名称永远不会改变该方法是否可以被 JVM 链接。但一般而言,该声明并不适用于兼容性。

从历史上看,参数名称被视为局部变量名称。 (毕竟,它们在范围内是局部的。)您可以随意更改它们,方法之外的任何内容都不会受到影响。但是,如果您启用对参数名称的反射访问,突然间您无法在不考虑程序的其他部分可能正在使用它的情况下更改名称。更糟糕的是,除非您对所有参数名称的使用都有严格的测试用例,或者您有一个非常好的静态分析器可以找到这些用例(我不知道有一个),否则没有什么可以告诉您的。

评论链接到关于使用 Jackson(一个 JSON 处理库)的问题,它具有将方法参数名称映射到 JSON 属性名称的功能。这可能非常方便,但也意味着如果更改参数名称,JSON 绑定(bind)可能会中断。更糟糕的是,如果程序根据 Java 方法参数名称生成 JSON 结构,那么更改方法参数名称可能会悄无声息地更改数据格式或线路协议(protocol)。显然,在这样的环境中,可靠地使用此功能意味着您必须进行非常好的测试,并在代码周围添加注释以指示不得更改哪些参数名称。

关于java-8 - javac -parameters 标志的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489323/

相关文章:

java - Java 8 中解析/处理 List<CompletableFuture<List<Object>>> 的最佳方法

java - 获取当前或调用方法的java.lang.reflect.Executable?

Java 注释 - javac 编译器错误?

java - 制作 :/bin/javac: Command not found

java - 使用流 api 对对象列表中的多个不同字段求和?

java - 用于在 Amazon Beanstalk Linux 上下载 Java 8 的 Dockerfile

Java 8 流 : difference between limit() and skip()

ubuntu-12.04 - Java编译器错误

java - 带 --java 标志和不带 --java 标志的 jruby AOT 类之间的区别

使用多个 CPU 内核的 javac