【问题标题】:What is the maximum number of methods a Java class can have?Java 类可以拥有的最大方法数是多少?
【发布时间】:2010-12-03 03:00:25
【问题描述】:

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

更新: 是的,目的是制作一个“上帝”类。

【问题讨论】:

  • 拥有一个包含大量方法的庞大类的目的是什么?
  • 是否有强烈的理由不想重构您的大类?您的描述暗示可能是神级反模式。
  • 是的,我对你将要做什么很感兴趣。
  • @Cameron - 我试图提出的观点是关于 OO 设计和这种方法的可维护性。它同样适用于自动生成的代码。此外,任何代码,即使是自动生成的,也有可能在某个时候被某人调试。您对模糊威胁部分的观点已注意到。并删除了评论。
  • 混合和丢失类结构以支持上帝类以进行某种类型的代码混淆?

标签: java class


【解决方案1】:

根据Java class file specification,限制为65535

4.10 Java 虚拟机的限制

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

  • 一个类或接口可以声明的方法数被ClassFile 结构(§4.1) 的methods_count 项的大小限制为65535。请注意,ClassFile 结构的 methods_count 项的值不包括从超类或超接口继承的方法。

【讨论】:

  • 我认为既然方法名也去了常量池,那65535的限制也和类中其他东西的名字(比如常量、字段)共享。
  • 请注意,您可能首先会遇到其他限制。我试图为具有 750 个字段的表报复 Hibernate 模型。这远低于 65535 方法的限制,不幸的是,类构造函数只能接受 255 个参数,这导致我的实验就此终止。
【解决方案2】:

没有。来自class file format spec的一些相关文章:

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

  • ClassFile 结构的 16 位 constant_pool_count 字段(第 4.1 节)将每个类或每个接口的常量池限制为 65535 个条目。这作为对单个类或接口的总复杂性的内部限制。

  • 一个类或接口可以声明的方法数被 ClassFile 结构的 methods_count 项的大小限制为 65535(第 4.1 节)。请注意,ClassFile 结构的 methods_count 项的值不包括从超类或超接口继承的方法。

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

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

  • 每个非本地、非抽象方法的代码量受限于 65536 字节,这取决于代码属性的 exception_table(第 4.7.3 节)和 LineNumberTable 属性(第 4.7.8 节)中的索引大小) 和 LocalVariableTable 属性 (§4.7.9)。

【讨论】:

  • 方法名称和类型描述符都不必是唯一的,只有两者的组合。例如。您可以将 256 个唯一方法名称与 256 个唯一类型描述符组合在一起,形成 65536 个唯一方法签名,而只需要 512 个常量池条目。这距离达到恒定池限制还很远。此外,一个字段和一些方法可以具有相同的名称,共享一个条目。但值得一提的是,构造函数算作方法,减少了可能声明的方法数量。
【解决方案3】:

虽然VM Spec中的methods_count是U2,因此是65535,但是method_info的格式有一个name_index和一个descriptor_index,它们都必须指向也有一个U2 constant_pool_count的常量池,所以32767是最大值,当然这是不可能,因为它不允许类名、超类字段等的任何其他条目。

【讨论】:

  • 不完全是。您可以拥有具有相同名称和不同参数类型的方法,也可以拥有具有不同名称和相同参数类型的方法。因此,您可以将 256 个唯一方法名称与 256 个唯一类型描述符组合在一起,形成 65536 个唯一方法签名,而只需要 512 个常量池条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多