Optimization 在javac中禁用优化?

Optimization 在javac中禁用优化?,optimization,javac,Optimization,Javac,我正在编写我自己的JVM副本,并想在一些简单的数字操作上测试它的行为,如加法、减法、数字溢出等。我认为,与其手工编写字节码,不如编写简单的Java代码,让javac编译成字节码,然后在字节码上测试JVM 问题是javac正在进行大量(非常明智的!)内联优化,这些优化阻止了代码测试我希望测试的内容。例如,一个测试尝试验证所有类型的整数溢出都得到了正确处理。这里有一个快照: byte min = (byte)-128; byte max = (byte) 127; assertTrue((byte

我正在编写我自己的JVM副本,并想在一些简单的数字操作上测试它的行为,如加法、减法、数字溢出等。我认为,与其手工编写字节码,不如编写简单的Java代码,让
javac
编译成字节码,然后在字节码上测试JVM

问题是
javac
正在进行大量(非常明智的!)内联优化,这些优化阻止了代码测试我希望测试的内容。例如,一个测试尝试验证所有类型的整数溢出都得到了正确处理。这里有一个快照:

byte min = (byte)-128;
byte max = (byte) 127;

assertTrue((byte)(max + 1) == min); // Should overflow and work correctly.
生成的
.class
文件的结果为
((字节)max+1)
硬编码为
(字节)-128
,这完全违背了测试点


我的问题是:有没有办法在
javac
中禁用优化?我还没有找到一个命令行开关来实现这一点,尽管我可能只是没有足够努力地寻找。如果没有办法做到这一点,是否还有其他Java编译器能够在关闭所有优化的情况下进行编译?

许多生产编译器,包括通用Sun派生的
javac
,都会进行类似的简化,而不管优化设置为什么

您看过Java字节码“汇编程序”吗?

我认为您所想到的大多数优化实际上都是由JLS强制执行的,就像这些一样。所以,确保没有常量表达式,javac无法优化它们

在您的示例中,您可以这样写:

byte min = new Byte((byte)-128).byteValue();
byte max = new Byte((byte) 127).byteValue();

assertTrue((byte)(max + 1) == min); // Should overflow and work correctly.

我没听说过茉莉花!这是一个很酷的链接。我可能得调查一下。