最近在对一个产品出升级补丁时遇到一个问题,与静态常量有关。
问题现象:
产品包中有一个product.jar,出升级补丁时,只修改了该jar包中的一个类中的一个静态常量。
public class AppConstant {
public static final String APP_NAME = "MyProduct";
}
改为
public class AppConstant {
public static final String APP_NAME = "MyProduct2";
}
将新的AppConstant.class添加到product.jar中后,发现没有实现预期的功能。
然后尝试重新生成完整的product.jar,添加到产品包中,新功能生效。
问题原因:
开始怀疑是编译环境jdk版本不一致导致的,于是尝试使用相同jdk编译,问题依旧。
后来怀疑是静态常量导致的问题,更新静态常量时,要同时更新引用该静态常量的类,并确保该类已经重新编译。因为静态常量被引用时,在编译期就已经确定了值,在运行期不会动态加载对应的值。
参考资料:
http://blog.csdn.net/ahhsxy/article/details/6097881
分享到:
相关推荐
参数传递通常有值传递和引用传递两种方式,值传递是将实际参数的值复制一份传递给被调用的过程,而引用传递则是传递参数变量的引用或地址。这种方式下,被调用的过程直接访问或修改调用者的变量。 在具体的实现中,...
其中,代码区存储编译后的机器指令,静态数据区则用于存储编译时就能确定大小的常量和变量,而栈区和堆区则用于动态分配和管理可变大小的数据以及过程调用时的上下文信息。 对于存储区域的整体布局,通常包括以下几...
《编译原理》是一门深度探讨计算机程序如何从高级语言转化为机器可执行代码的学科。在计算机科学中,编译器扮演...在实际工作中,编译原理的原理和技术也被广泛应用于各种领域,如静态代码分析、动态编译、语言设计等。
12. **数据对象存储分配策略**:静态分配在编译时确定,动态分配则在运行时进行,栈式分配用于局部变量,堆分配用于复杂的数据结构。 13. **代码优化**:编译器可能进行常量合并、公共子表达式删除、复写传播和死...
在某些情况下,如值传递和引用传递,语义分析器还需要处理参数的传递方式,例如,值调用传递的是实参的右值,而引用调用传递的是实参的左值。 4. **中间代码生成**:在语义分析之后,编译器可能会生成中间代码,如...
静态存储分配是在编译阶段即确定所有数据对象的存储位置,适用于如C语言中的静态变量和外部变量。相反,动态存储分配则用于处理在运行时才能确定大小的数据,例如递归过程、动态数组或用户自定义的内存管理。动态...
const是常量,其值在编译时确定,一旦赋值后不可更改。常量在编译期间被内联到引用它的代码中,因此速度较快。例如,strConst在Example02Lib的Class1中声明为const,它的值在编译时确定并嵌入到使用它的代码中,无法...
程序在运行时,存储组织的任务是将静态的源代码转换为动态运行状态,确保程序中的变量、常量、工作单元、函数调用等在内存中有恰当的位置。编译器在编译阶段会预先设计好这种组织形式,并通过生成的目标代码来体现...
10. **实践应用**:编译原理不仅应用于传统的编译器开发,还广泛应用于解释器、动态语言运行时、JIT编译器、静态代码分析工具等领域。 通过研读《清华版编译原理课后答案》,学生可以更深入地理解这些概念,提高...
此阶段也可能涉及类型推断,例如在静态类型语言中确定未显式指定类型的变量的类型。 4. **中间代码生成(Intermediate Code Generation)**: 编译器通常会生成一种中间表示(IR),这种表示与具体的机器架构无关...
静态语义分析通常在编译时进行,它包括类型检查、常量折叠、声明检查、作用域分析等。例如,确保变量在使用前已被正确定义,或者检查操作数类型是否匹配操作符的要求。动态语义分析则是在程序运行时进行,如异常处理...
静态库是一组预编译的目标文件的集合,用于在链接阶段被其他程序引用。 - **命名规则**:静态库通常以`lib`开头,以`.a`为扩展名。 - **作用**:链接时将库中的代码合并到最终的可执行文件中,这样就不需要在运行时...
语法分析阶段的输出是抽象语法树,它是后续编译阶段的基础。 #### 三、语义分析(Semantic Analysis) 语义分析阶段是对语法分析阶段生成的AST进行进一步的检查,确保代码的语义正确。这一步骤包括但不限于类型...
10. **实践应用**:编译原理不仅用于传统的编译器,还在解释器、JVM、JavaScript引擎、静态代码分析工具、动态编译(如JIT)等领域发挥着重要作用。 通过这个大学的编译原理课件,学生可以系统地学习这些概念,理解...
* 元数据验证:对字节码描述的信息进行语义分析(注意:比照 javac 编译阶段的语义分析),以保证其描述的信息符合 Java 语言规则的要求;例如:这个类是否有父类,除了之外。 * 字节码验证:通过数据流和控制流分析...
对于`static final`修饰的常量,其值在准备阶段即已确定。 解析阶段,JVM将符号引用转换为直接引用。符号引用是编译期间的引用形式,而直接引用是运行时可以直接定位到目标的引用。这个阶段通常发生在初始化之前,...
编译原理是计算机科学中的一个重要领域,主要研究如何将高级编程语言转换为机器可以理解的低级语言,即汇编语言或机器语言。这个过程通常包括多个阶段:词法分析、语法分析、语义分析以及代码生成。我们将逐一探讨...
使用 OpenSSL 静态库时,开发人员需要链接 libeay32.lib 和 ssleay32.lib,确保在编译和链接阶段能够访问到所需的功能。在项目设置中指定这些库的位置,并正确设置链接选项,就可以在你的代码中使用 OpenSSL 的加密...