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

标签 java-8 javac

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

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

最佳答案

JEP 118 涵盖了向类文件格式添加参数名称。 ,它是在 Java 8 中提供的。关于为什么在 OpenJDK 电子邮件线程 here 中包含参数名称是可选的,有一些讨论。和 here .简而言之,使参数名称可选的原因是担心类文件大小、兼容性表面和敏感信息的暴露。

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

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

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

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

相关文章:

java - CSS API (JavaFX 8) - 有人可以向我解释一个主题吗?

java - 为什么java(maven)在编译过程中关心文件时间戳?

java - 使用 Java 中的命令行和外部 Jars 编译多个包

java - java中使用unicode字符命名文件

intellij-idea - 如何将intellij编译错误输出语言设置为英文?

Javac 找不到类路径中引用的包

java - 需要微服务框架

java8 - 缺少变量和可选

java - 从内部匿名类访问外部匿名类的方法

java-8 - 是否有 Java 8 等价于 grails 中的 collat​​e 方法?