扫码关注官方订阅号
如何在编译java的时候,取消编译器对编译常量的优化?
关于编译期常量:
参见下面链接http://stackoverflow.com/questions/90...
人生最曼妙的风景,竟是内心的淡定与从容!
我大概明白了,也许你遇到的问题是你想重新编译某个java文件(比如A.java),里面有个常量(比如final int a)和上次编译时不一样,但是另一个使用A.class的a的文件(比如B.java)由于在javac在上次编译的时候将当时的A.class里面的常量直接给内联了,所以就达不到你想要的效果。
A.java
final int a
A.class
a
B.java
javac
如果是这样的话,对于String你可以使用.intern()来防止编译器进行优化,对于其他类型,你可以要么不定义为常量,要么将常量定义为private,然后使用一个static方法来返回这个常量。
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),等等等等。 我测试了一下,这个方法完全可用。
getInt(null)
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我大概明白了,也许你遇到的问题是你想重新编译某个java文件(比如
A.java
),里面有个常量(比如final int a
)和上次编译时不一样,但是另一个使用A.class
的a
的文件(比如B.java
)由于在javac
在上次编译的时候将当时的A.class
里面的常量直接给内联了,所以就达不到你想要的效果。如果是这样的话,对于
String
你可以使用.intern()
来防止编译器进行优化,对于其他类型,你可以要么不定义为常量,要么将常量定义为private
,然后使用一个static
方法来返回这个常量。来源:
http://stackoverflow.com/questions/37...
http://docs.oracle.com/javase/specs/j...
编辑:楼主提到了无法修改对方(我猜指的是常量提供者)的源文件,那么也有另一种方式可以强制读取常量的内容,那就是使用反射。
如果常量的类型是int则可以使用
getInt(null)
,等等等等。我测试了一下,这个方法完全可用。