簡體   English   中英

Java 方法聲明中的最大參數個數

[英]Maximum number of parameters in Java method declaration

Java 中的方法最多可以有多少個參數,為什么?

我在 64 位 Windows 系統上使用 Java 1.8。

StackOverflow 上關於這個的所有答案都說技術限制是 255 個參數,但沒有說明原因。

准確地說,static 為 255,非靜態方法為 254(在this例中為第 255 個)方法。

我認為這可以在某種規范中進行描述,並且只是靜態定義了允許的最大參數數量。

但這僅對int和所有 4 字節類型有效。 我用long參數做了一些測試,在那種情況下我只能聲明 127 個參數。

使用String參數,我從測試中推導出的允許數量是 255(可能是因為引用大小是 Java 中的 4 個字節?)。

但是因為我使用的是 64 位系統,引用大小應該是 8 個字節寬,所以對於String參數,最大允許數量應該是 127,類似於long類型。

這個限制是如何准確應用的?

限制與方法的堆棧大小有什么關系嗎?

注意:我真的不會在任何方法中使用這么多參數,但這個問題只是為了澄清確切的行為。

該限制在JVM規范中定義:

的方法的參數的數量一方法描述符(§4.3.3),其中該限制包括一個單元實例或接口方法調用的情況下的定義限制為255。

§4.3.3節提供了一些額外的信息:

方法描述符僅在表示總長度為255或更小的方法參數時才有效,其中該長度包括在實例或接口方法調用的情況下對此的貢獻。

總長度是通過對各個參數的貢獻求和來計算的, 其中long或double類型的參數對長度貢獻兩個單位,而任何其他類型的參數貢獻一個單位

您的觀察結果是正確的,雙字基元( long / double )需要兩倍於通常的4字節變量和4字節對象實例引用的大小

關於與64位系統相關的問題的最后一部分,規范定義了參數貢獻了多少單位 即使在64位平台上也必須遵守規范的一部分,64位JVM將容納255個實例參數(如255 Strings )無論內部對象的指針大小如何。

JVM規范的4.3.3節包含您要查找的信息:

方法描述符僅在表示總長度為255或更小的方法參數時才有效,其中該長度包括在實例或接口方法調用的情況下對此的貢獻。 總長度是通過對各個參數的貢獻求和來計算的,其中 long或double類型 的參數對 長度 貢獻兩個單位 而任何其他類型 參數貢獻一個單位

因此,主機是32位還是64位似乎對參數數量沒有影響。 如果您注意到,文檔以“單位”表示,其中一個“單位”的長度是單詞大小的函數。 如果參數的數量與字大小成正比,則會出現可移植性問題; 您將無法在不同的體系結構上編譯相同的Java程序(假設至少有一種方法使用具有較大字長的體系結構上的最大參數數)。

我在時事通訊中發現了一個有趣的問題, http://www.javaspecialists.eu/archive/Issue059.html

ClassFile結構的16位constant_pool_count字段將每類或每接口常量池限制為65535個條目。 這是對單個類或接口的總復雜性的內部限制。 每個非本機非抽象方法的代碼量由Code屬性的exception_table,LineNumberTable屬性和LocalVariableTable屬性中的索引大小限制為65536字節。

在調用方法時創建的幀的局部變量數組中最大數量的局部變量被Code35屬性的max_locals項的大小限制為65535,該屬性給出了方法的代碼。 請注意,long和double類型的值都被認為是保留兩個局部變量並為max_locals值提供兩個單位,因此使用這些類型的局部變量會進一步降低此限制。

可以由類或接口聲明的字段數量被ClassFile結構的fields_count項的大小限制為65535。 請注意,ClassFile結構的fields_count項的值不包括從超類或超接口繼承的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM