由于Class文件中方法、字段等都需要引用 CONSTANT_Utf8_info
型常量来描述名称,所以 CONSTANT_Utf8_info
型常量的最大长度也就是 Java 中方法、字段名的最大长度。
我们来看看 CONSTANT_Utf8_info
的数据结构:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
我们重点关注下长度为 length
的那个 bytes
数组,这个数组就是真正存储常量数据的地方,而 length
就是数组可以存储的最大字节数。
length
的类型是 u2
,u2
是无符号的 16 位整数,因此允许的的最大长度是 2^16-1=65535
。
所以 Java 程序中如果定义了超过 65535 个(约等于 64KB )英文字符的变量或方法名,即使规则和全部字符都是合法的,也会无法编译。