在 javac 中禁用 StringBuilder 优化

3
在Java中使用普通字符串连接时,javac会优化它,尽可能地使用StringBuilder(或在Java 5之前使用StringBuffer)。
在我的情况下,关闭所有这些优化并仅使用String上的常规“append”方法进行字符串连接将非常有帮助。这种优化是否完全嵌入到javac中,还是有一种方法可以完全禁用它呢?

7
为什么你想要禁用它? - SimonC
2
@SimonC 我正在编写一个工具,它可以基于JDI事件创建学生Java代码的可视化。当StringBuilder的可视化出现时,而实际上他们并没有使用任何StringBuilder,这可能会令人困惑。 - Michael Berry
1
@berry120 但是如果您附有源代码,难道您不能从源代码中找出是实际上使用了 StringBuilder 还是普通的字符串连接,并相应地进行操作吗? - SpaceTrucker
1
@SpaceTrucker 是的,它可以做到。但这涉及解析源代码,因此显然是非常棘手的。这可能是我现在要考虑的选项,但如果 javac 本身存在这样的选项,那么它会使我的生活变得更轻松! - Michael Berry
学生们了解字符串拼接底层实现的原理不是很有用吗?我希望我的同事们也能意识到这一点,这样他们就不会像编译器生成的代码一样使用 StringBuilder 了。 - SimonC
显示剩余4条评论
2个回答

3

我不是javac专家,但看起来它是在javac中硬编码的,在Gen.java文件的1793行。


谢谢,这正是我想听到的 - 看起来确实没有其他办法了。那我们考虑其他选项吧! - Michael Berry
我不是 javac 专家,但由于 assylias 找到了你问题的根源,你可以尝试修补 Gen.java,制作自己的编译器版本。我不知道 Gen 嵌入得有多深,但你可以扩展这个类,或者只是简单地修改并编译一个新的 Gen.class,然后将其替换为适当的系统 jar 文件中的文件。 - gaborsch

1

请看这个 链接,它与Eclipse有关,但如果您正在使用Eclipse,您可能会发现一些与优化选项相关的配置,例如未使用的本地变量等,希望您能找到一些有用的东西。

或者,这个汇编器 可能会对您有所帮助。它采用Java虚拟机指令集的简单汇编语法编写的Java类的ASCII描述。它将它们转换为二进制Java类文件,适合由Java运行时系统加载。


谢谢你的回答 - 不幸的是,我目前只能依赖于标准JDK附带的标准javac。可能在某些时候需要更改,但我尽量推迟这个决定! - Michael Berry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接