成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java方法可以定義多少個(gè)參數(shù)-創(chuàng)新互聯(lián)

Java方法可以定義多少個(gè)參數(shù)?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)建站專注于烏蘭網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供烏蘭營(yíng)銷型網(wǎng)站建設(shè),烏蘭網(wǎng)站制作、烏蘭網(wǎng)頁設(shè)計(jì)、烏蘭網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造烏蘭網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供烏蘭網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

如何定義 Java 中的方法

所謂方法,就是用來解決一類問題的代碼的有序組合,是一個(gè)功能模塊。

一般情況下,定義一個(gè)方法的語法是:

Java方法可以定義多少個(gè)參數(shù)

其中:

1、 訪問修飾符:方法允許被訪問的權(quán)限范圍, 可以是 public、protected、private 甚至可以省略 ,其中 public 表示該方法可以被其他任何代碼調(diào)用,其他幾種修飾符的使用在后面章節(jié)中會(huì)詳細(xì)講解滴

2、 返回值類型:方法返回值的類型,如果方法不返回任何值,則返回值類型指定為 void ;如果方法具有返回值,則需要指定返回值的類型,并且在方法體中使用 return 語句返回值

3、 方法名:定義的方法的名字,必須使用合法的標(biāo)識(shí)符

4、 參數(shù)列表:傳遞給方法的參數(shù)列表,參數(shù)可以有多個(gè),多個(gè)參數(shù)間以逗號(hào)隔開,每個(gè)參數(shù)由參數(shù)類型和參數(shù)名組成,以空格隔開

本文將詳細(xì)的介紹Java方法能定義多少個(gè)參數(shù)的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧

一:為什么研究這么無聊的問題

這兩天在讀一本老書《Orange'S 一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》,把丟了很長(zhǎng)時(shí)間沒研究的操作系統(tǒng)又重新拾起來了,在第三章講解“保護(hù)模式”時(shí),作者提到了調(diào)用門描述符中的Param Count只有5位,也就是說,最多只支持32個(gè)參數(shù),這本來只是一個(gè)不是特別重要的細(xì)節(jié),但是卻勾起了我的思索:在JVM中,一個(gè)Java方法,最多能定義多少參數(shù)呢?我知道這是一個(gè)很無聊的問題,即使能定義一萬個(gè),十萬個(gè),誰又會(huì)真的去這么做呢。但是作為一個(gè)Coder,最重要的不就是好奇心嗎,沒有好奇心,和一條咸魚又有什么區(qū)別呢?

二:實(shí)地考察

這種問題,第一步當(dāng)然就是看看JVM中關(guān)于方法的定義,這里以openJDK10中的HotSpot為例。

在ConstMethod中,代表參數(shù)數(shù)量的字段為_size_of_parameters。

 u2  _size_of_parameters;  // size of the parameter block (receiver + arguments) in words

_size_of_parameters的類型為u2,在JVM中,u2為2個(gè)字節(jié)長(zhǎng),那么理論上來說,HotSpot支持的方法大參數(shù)數(shù)量為2^16 - 1,即65535。

這個(gè)答案究竟是否正確呢?實(shí)踐出真知!

當(dāng)然我不會(huì)傻到真的去一個(gè)個(gè)定義65535個(gè)參數(shù),那我豈不成了“數(shù)一億粒米”的幼兒園老師了?Coder就得按照Coder的辦法:

 public static void main(String[] args) {
 for (int i = 0; i < 65535; i++) {
  System.out.print("int a" + i + ",");
 }
 }

完美解放了生產(chǎn)力? 。

生成完參數(shù)列表,定義好方法,當(dāng)我滿懷信心的開始編譯時(shí),編譯器給了我狠狠一刀:

Java方法可以定義多少個(gè)參數(shù)

居然不是65535?那應(yīng)該是多少呢?難道是一個(gè)字節(jié)長(zhǎng)?廢話不多說,我立即來實(shí)驗(yàn)了下255個(gè)參數(shù),編譯通過,再試了一下256,和65535時(shí)一樣報(bào)錯(cuò)。那么結(jié)果很明顯了,Java方法最多可以定義255個(gè)參數(shù)。

我查看了下Javac源碼,在生成方法的字節(jié)碼時(shí),有方法參數(shù)數(shù)量限制判斷:

 if (Code.width(types.erasure(env.enclMethod.sym.type).getParameterTypes()) + extras > ClassFile.MAX_PARAMETERS) {
 log.error(tree.pos(), "limit.parameters");
 nerrs++;
 }

其中 ClassFile.MAX_PARAMETERS = 255。

事情到這里我很不甘心,HotSpot中明明是用兩個(gè)字節(jié)長(zhǎng)來定義的方法參數(shù)數(shù)量,莫非只是Javac在編譯過程中做了限制?只要能成功編譯出一個(gè)有256個(gè)參數(shù)的java方法,在虛擬機(jī)中一試便知,但是怎么才能繞過Javac呢?

我覺得主要有以下兩種辦法:

一:修改Javac源碼,干掉以上參數(shù)限制這一段代碼,再重新編譯;

二:利用字節(jié)碼修改工具,硬改字節(jié)碼,加上一個(gè)擁有256個(gè)參數(shù)的方法。

第一種方法看似簡(jiǎn)單,但是其實(shí)從openJDK中提取出來的Javac項(xiàng)目不能直接run,需要很多配置,而且源碼依賴了很多jdk中的不可見類,操作起來很麻煩。所以這里我采用了第二種方法,工具選用的是老朋友javassist。

其實(shí)javassist使用起來很簡(jiǎn)單,這里我只需要對(duì)一個(gè)已有的class文件加上一個(gè)新方法即可:

 try {
  StringBuilder sb = new StringBuilder();

  sb.append("public static void testMax(");

  for (int i = 0; i < 256; i++) {
  sb.append("int a" + i);
  if(i < 255) {
   sb.append(",");
  }
  }
  sb.append("){}");

  ClassPool cPool = new ClassPool(true);
  cPool.insertClassPath("/Users/wanginbeijing/Documents/MyProgramings/java/Mine/test/src");
  CtClass cClass = cPool.get("com.wangxiandeng.test.Test");
  CtMethod newMethod = CtNewMethod.make(sb.toString(), cClass);
  cClass.addMethod(newMethod);
  cClass.writeFile("/Users/wanginbeijing/Documents/MyProgramings/java/Mine/test/src");
 } catch (NotFoundException e) {
  e.printStackTrace();
 } catch (CannotCompileException e) {
  e.printStackTrace();
 } catch (
  IOException e) {
  e.printStackTrace();
 }

以上就通過javassist成功的給Test.class 文件加上了一個(gè)擁有256個(gè)參數(shù)的方法testMax()?,F(xiàn)在讓我們運(yùn)行下Test.class試試:

 java com.wangxiandeng.test.Test

沒想到這次雖然瞞過了編譯器,卻沒有過的了虛擬機(jī)這一關(guān),運(yùn)行直接報(bào)錯(cuò)了:

錯(cuò)誤: 加載主類 com.wangxiandeng.test.Test 時(shí)出現(xiàn) LinkageError
        java.lang.ClassFormatError: Too many arguments in method signature in class file com/wangxiandeng/test/Test

看樣子Java不僅僅在編譯期會(huì)對(duì)方法參數(shù)數(shù)量做限制,在虛擬機(jī)運(yùn)行期間同樣會(huì)干這件事。
本著一查到底的精神,我在HotSpot源碼中搜索了下上面報(bào)的錯(cuò)誤,找到了虛擬機(jī)檢查參數(shù)數(shù)量的地方:

Method* ClassFileParser::parse_method(const ClassFileStream* const cfs,
     bool is_interface,
     const ConstantPool* cp,
     AccessFlags* const promoted_flags,
     TRAPS) {
 ......
 if (_need_verify) {
  args_size = ((flags & JVM_ACC_STATIC) ? 0 : 1) +verify_legal_method_signature(name, signature, CHECK_NULL);

  if (args_size > MAX_ARGS_SIZE) {
   classfile_parse_error("Too many arguments in method signature in class file %s", CHECK_NULL);
  }
 }
 ......
}

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

當(dāng)前名稱:Java方法可以定義多少個(gè)參數(shù)-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article12/dchidc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站制作企業(yè)網(wǎng)站制作、ChatGPT、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
平利县| 嘉鱼县| 托克逊县| 扎鲁特旗| 灵川县| 永宁县| 阜新市| 衡阳县| 内江市| 吴江市| 铜梁县| 吴忠市| 黄平县| 白玉县| 白玉县| 新宁县| 汪清县| 涿州市| 中卫市| 都江堰市| 葵青区| 阜康市| 五指山市| 滨州市| 英超| 洞口县| 岢岚县| 高密市| 墨江| 信阳市| 隆林| 大庆市| 资兴市| 石景山区| 济源市| 克拉玛依市| 浪卡子县| 绍兴县| 桂东县| 德庆县| 古蔺县|