Activity 源码中的「private static final boolean DEBUG_LIFECYCLE = false;」有什么作用?

这个DEBUG_LIFECYCLE在Activity的每个生命周期方法中都会调用一次,判断是否要打印生命周期; 但DEBUG_LIFECYCLE 的属性是private static final的呀,只能为false,那要DEBUG_LIFECYCLE有什么用呢? 我试图用反射把DEBUG_LIFECYCLE 改成true,但android貌似改了Field的源码,于是失败了~~ JAVA反射修改常量,以及其局限 Android: changing private static final field using java reflection
关注者
30
被浏览
1984
感觉大家回答得都是差不多那个意思但都没把最重要的点说出来。

Java语言规范对boolean类型的常量表达式以及几种条件控制流结构之间的交互做了特殊规定:如果if的条件表达式是一个boolean类型的常量表达式,那么Java编译器不必为条件肯定为false的那个分支生成代码——
if (true)
if (false)
是Java的“条件编译”(conditional compilation)的实现方式。要注意的是这是只对if的特殊规定,其它控制流结构没有这种效果,while、for、do-while的循环条件就算是常量表达式也达不到条件编译的效果。

请参考Java Language Specification的下面三段:
1、Chapter 15. Expressions - Constant Expressions
2、Chapter 14. Blocks and Statements - Unreachable Statements
3、Chapter 13. Binary Compatibility - Conditional Compilation

规范里特别举例提到可以用这种条件编译的能力来写出
static final boolean DEBUG = false;
这样形式的代码然后用于条件编译,把一些只用于调试用途的代码保留在源码里但让其不起作用:
if (DEBUG) { x=3; }

既然是条件编译,要改变其状态并起作用,自然需要修改那个DEBUG变量(“常量”)的值之后重新编译才有用了,靠反射修改是不管用的。