我有一个 Java 项目,涉及类GUIConstants-public static final用于布局 GUI 的各种参数,因为不同的组件有时必须具有相同的大小或颜色或其他。
我目前正处于进行视觉重新设计的阶段,其中涉及更改其中一些常量。然而,ant这让这变得困难。我将更改一个参数并重新编译,但仍使用旧值。如果我对使用它的文件之一添加一些简单的修改并重新编译,将使用正确的值。但必须追踪所有文件并修改它们,这很烦人且容易出错。当然有一种方法可以强制ant重新编译未更改的文件......我只是在手册页中找不到它。
旁注:我的假设是,当编译使用变量的类时,Java 会使用值本身,而不是对变量所指向的任何内容的引用(与C 中使用常量的final方式类似)。#DEFINE因此,即使变量指向其他内容,原始值也会被烘焙到.class文件中。这是真的?(这不影响我的问题,我只是好奇。)
提前致谢。
你的假设几乎是正确的。但这不仅仅是final变量,而是所谓的“常量变量”:
\n\n我们将原始类型或 String 类型的变量称为常量变量,该变量是最终的并使用编译时常量表达式 ( \xc2\xa715.28 ) 进行初始化。变量是否是常量变量可能会对类初始化 ( \xc2\xa712.4.1 )、二进制兼容性 ( \xc2\xa713.1、\xc2\xa713.4.9 ) 和明确赋值 ( \xc2\ xa716)。
\n
然后在二进制兼容性部分(\xc2\xa713.1):
\n\n\n对常量变量 (\xc2\xa74.12.4) 的字段的引用在编译时解析为所表示的常量值。二进制文件的代码中不应存在对此类常量字段的引用(包含常量字段的类或接口除外,它们将具有初始化它的代码)
\n
和(\xc2\xa713.4.9)(我的重点):
\n\n\n如果字段是常量变量 (\xc2\xa74.12.4),则删除关键字 Final 或更改其值不会导致它们无法运行,从而破坏与预先存在的二进制文件的兼容性,但它们不会看到任何新值除非重新编译该字段的用法。
\n
在之前的工作中,我们利用它来建立一种条件编译系统,以便我们可以生成删除所有调试语句的生产二进制文件。
\njavac当您将其与任务确定要重新编译哪些类的方式结合起来时,您会得到您所看到的行为:
\n\n仅编译没有相应 .class 文件或类文件早于 .java 文件的 Java 文件。
\n注意:Apache Ant 仅使用源文件和类文件的名称来查找需要重建的类。它不会扫描源文件,因此不会了解嵌套类、与源文件命名不同的类等等。请参阅
\n<depend>基于存在/修改时间以外的依赖性检查的任务。
解决这个问题的最简单方法是每次都进行一次干净的完整编译,例如ant clean compile(假设您有一个clean删除所有类文件的目标)。但这可能太慢了。
我还建议您按照任务depend文档中的建议查看该任务javac,但是查看它的文档(我自己实际上没有使用过它)似乎没有帮助(请参阅标题为“限制”的部分):
\n\n这些限制最明显的例子是,当其他类导出的常量原始数据类型发生更改时,任务无法判断要重新编译哪些类。
\n
如果您发现每次进行干净编译太慢,一种可能的解决方法是使类中的值GUIConstants不是常量,至少在进行更改时是这样。您可以通过注释掉所有final关键字来使值成为非最终值,然后其他类应该会看到您的更改。当您对新值感到满意时,将finals 放回并重新编译(当然,并测试一切是否仍然正常工作)。
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |