您好,匿名用户
随意问技术百科期待您的加入

如何在编译java的时候,取消编译器对编译常量的优化?

0 投票

如何在编译java的时候,取消编译器对编译常量的优化?

关于编译期常量:

参见下面链接
http://stackoverflow.com/questions/90...

用户头像 提问 2014年 4月3日 @ Lancer 上等兵 (183 威望)
分享到:

1个回答

0 投票
 
最佳答案

我大概明白了,也许你遇到的问题是你想重新编译某个java文件(比如A.java),里面有个常量(比如final int a)和上次编译时不一样,但是另一个使用A.classa的文件(比如B.java)由于在javac在上次编译的时候将当时的A.class里面的常量直接给内联了,所以就达不到你想要的效果。

如果是这样的话,对于String你可以使用.intern()来防止编译器进行优化,对于其他类型,你可以要么不定义为常量,要么将常量定义为private,然后使用一个static方法来返回这个常量。

来源:
http://stackoverflow.com/questions/37...
http://docs.oracle.com/javase/specs/j...

编辑:楼主提到了无法修改对方(我猜指的是常量提供者)的源文件,那么也有另一种方式可以强制读取常量的内容,那就是使用反射。

import java.lang.reflect.Field
    
// Inside some method
Field field = ConstProvider.class.getField("SOME_CONSTANT");
Object value = field.get(null);

如果常量的类型是int则可以使用getInt(null),等等等等。
我测试了一下,这个方法完全可用。

用户头像 回复 2014年 4月3日 @ Xin Zhao 上等兵 (320 威望)
选中 2013年 9月7日 @Lancer
提一个问题:

相关问题

0 投票
1 回复 60 阅读
0 投票
1 回复 70 阅读
0 投票
0 回复 36 阅读
+1 投票
1 回复 46 阅读
用户头像 提问 2013年 1月29日 @ Zeus 上等兵 (193 威望)
0 投票
0 回复 20 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...