一个Java类最多可以有多少个方法?

一个Java类最多可以有多少个方法?,java,class,Java,Class,我正在考虑构建一个非常大的Java类,Java类可以拥有的方法数量有没有限制?它能进入数百万种方法吗 更新: 是的,目的是建立一个“上帝”类。根据限制是65535: 4.10 Java虚拟机的限制 Java虚拟机的以下限制隐含在类文件格式中: 类或接口可以声明的方法的数量限制为65535个,这取决于类文件结构()的方法计数项的大小。请注意,ClassFile结构的methods\u count项的值不包括从超类或超接口继承的方法 否。以下文件中的一些相关部分: Java虚拟机的以下限制隐含在

我正在考虑构建一个非常大的Java类,Java类可以拥有的方法数量有没有限制?它能进入数百万种方法吗

更新: 是的,目的是建立一个“上帝”类。

根据限制是65535

4.10 Java虚拟机的限制 Java虚拟机的以下限制隐含在
文件格式中:

  • 类或接口可以声明的方法的数量限制为65535个,这取决于
    类文件
    结构()的
    方法计数
    项的大小。请注意,
    ClassFile
    结构的
    methods\u count
    项的值不包括从超类或超接口继承的方法

否。以下文件中的一些相关部分:

Java虚拟机的以下限制隐含在类文件格式中:

  • 类文件结构的16位常量池计数字段(§4.1)将每类或每接口常量池限制为65535个条目。这是对单个类或接口的总体复杂性的内部限制

  • 类或接口可以声明的方法数量受类文件结构的方法计数项的大小限制为65535(§4.1)。请注意,类文件结构的methods\u count项的值不包括从超类或超接口继承的方法

我认为这意味着您可以有65535个方法,但前提是您没有其他对象占用常量池中的插槽(例如字段名)

除此之外,每种方法还有一个最大尺寸:

  • 每个非本机非抽象方法的代码量受代码属性(§4.7.3)、LineNumberTable属性(§4.7.8)和LocalVariableTable属性(§4.7.9)的exception_表中索引的大小限制为65536字节
尽管VM规范中的方法计数为U2,因此65535方法信息的格式有一个名称索引和一个描述符索引,这两个索引都必须指向常数池,该常数池也有一个U2常数池计数,因此32767是最大值,即使这样也不可能,因为它不允许为类名添加任何其他条目,超级类字段等。

拥有一个包含许多方法的大型类的目的是什么?有没有强烈的理由不想重构您的大型类?你的描述暗示你可能是上帝级的反模式。是的,我对你将要做的事很感兴趣。@Cameron-我想说的是关于OO设计和这种方法的可维护性。它同样适用于自动生成的代码。此外,任何代码,即使是自动生成的,也有可能在某个时候被人调试到其中。你关于模糊威胁部分的观点已经被注意到了。和注释被删除。混合和丢失类结构以支持某种类型的代码混淆?我认为,由于方法名称也会进入常量池,65535限制也会与类中其他内容(例如常量、字段)的名称共享。请注意,您可能会先遇到其他限制。我试图为一个包含750个字段的表展示一个Hibernate模型。这远远低于65535方法的限制,不幸的是类构造函数只能接受255个参数,这就扼杀了我的实验。不完全是这样。您可以有具有相同名称和不同参数类型的方法,也可以有具有不同名称和相同参数类型的方法。因此,您可以将256个唯一的方法名称与256个唯一的类型描述符组合在一起,形成65536个唯一的方法签名,而只需要512个常量池条目。方法名称和类型描述符都不必是唯一的,只需要两者的组合。例如,您可以将256个唯一的方法名称与256个唯一的类型描述符组合起来,形成65536个唯一的方法签名,而只需要512个常量池条目。这还远远没有达到持续的游泳池限制。此外,字段和某些方法可以具有相同的名称,共享一个条目。但值得一提的是,构造函数的计数方式类似于方法,从而减少了声明方法的可能数量。