我们可以在一个类中声明多少接口。
这个数字 65535 ?如果是,那么为什么?如果不是,限制是什么?为什么?
类似的东西:
public class GenericModelLinker {
public interface Link {
Object getProperty(IAdaptable n);
void setProperty(IAdaptable n, Object value);
}
// .........so on
}
先谢谢
答案 0 :(得分:0)
是的!根据Java虚拟机的官方Specifications。看起来字段,方法和嵌套类型信息都存储在某种有限大小的结构中。
如果您问为什么65535
?仅仅因为:
它是可以用无符号表示的最高数字 16位二进制数
隐含了Java虚拟机的以下限制 类文件格式:
每类或每接口常量池限制为65535 ClassFile的16位constant_pool_count字段的条目 结构(§4.1)。这是对总数的内部限制 单个类或接口的复杂性。
类或接口可以声明的字段数 ClassFile的fields_count项的大小限制为65535 结构(§4.1)。
请注意ClassFile的fields_count项的值 结构不包括从超类继承的字段 或超级接口。
类或接口可以声明的方法数 由methods_count项的大小限制为65535 ClassFile结构(§4.1)。
请注意ClassFile的methods_count项的值 结构不包括从中继承的方法 超类或超级接口。
类或接口的直接超接口的数量是 由interfaces_count项的大小限制为65535 ClassFile结构(§4.1)。
局部变量数组中最大数量的局部变量 在调用方法(第2.6节)时创建的帧限制为65535 通过Code属性的max_locals项的大小(§4.7.3) 给出方法的代码,以及16位局部变量 索引Java虚拟机指令集。
请注意,long和double类型的值都被认为是 保留两个局部变量,并为此提供两个单位 max_locals值,因此进一步使用这些类型的局部变量 减少这个限制。
帧中操作数堆栈的大小(第2.6节)限制为65535 代码属性的max_stack字段的值(第4.7.3节)。
请注意,long和double类型的值都被认为是 向max_stack值贡献两个单位,因此使用值 操作数堆栈上的这些类型进一步降低了这个限制。
通过定义,方法参数的数量限制为255 方法描述符(§4.3.3),其中限制包括一个单位 在实例或接口方法调用的情况下。
请注意,方法描述符是根据概念定义的 方法参数length,其中long或double类型的参数 有两个单位的长度,所以这些类型的参数 进一步减少限制。
字段和方法名称,字段和方法描述符的长度, 和其他常量字符串值(包括那些引用的值) ConstantValue(§4.7.2)属性限制为65535个字符 CONSTANT_Utf8_info结构的16位无符号长度项 (§4.4.7)。
请注意,限制是在编码中的字节数而不是 关于编码字符的数量。 UTF-8编码一些字符 使用两个或三个字节。因此,字符串包含多字节 角色受到进一步限制。
数组中的维数限制为255 multianewarray指令的维度操作码和 对多重战争,新阵型和新阵列的限制 说明(§4.9.1,§4.9.2)。