java 怎么获取形参名_获得方法形参名称列表 -- 哦也,搞定!!
JAVA獲取類的方法的參數名 – 老話題,新方法!!
折騰了一天,終于搞定了.測試了nutz所有的類,均讀取正常!! 完美讀取任何class的變量名信息! 呵呵,當前,前提是編譯時含debug信息.
無任何依賴,不需要asm,不要其他任何字節碼工具,純標準JDK API實現. 核心代碼,僅一個方法,130行,哦也!!
終于完成這個一直想做到的功能 – 在Java中,獲取方法的形參(參數)的名字.由于這個類只做需要做的事,所以,我非常確信它比asm的vistor更快,更可靠.
public void list(int page , int pageSize) { //這個類的作用,就是拿到page和pageSize這兩個名字,是的,是名字.
//...
}
實現關鍵點::
1. 跳過一切不需要的數據結構,如版本號,接口信息,字段信息
2. 只解析常量池中UTF8_String,因為只用到這個,其他都是多余的常量
3. 實現方法到descriptor的轉換函數,因為字節碼中的方法簽名,是descriptor格式的
代碼中含義泛型,直接貼這里的話,頁面顯示比較麻煩,就上個截圖吧.
代碼已經提交到nutz,并添加了一個gist,歡迎使用,如果有任何解析失敗的類,非常歡迎發送給我進行檢測.
總結一下值得注意的寫法:
1. DataInputStream.skip跟DataInputStream.skipBytes不是一回事,當較大的數值傳入skip方法,這個方法實際跳過的字節數,往往小于預期.雖然skipBytes也并不保證完整跳過,但至今沒發現非完整跳過的情況
DataInputStream.readUnsignedShort()的返回值是int,而readShort的返回值是short,以前一直以為short是無符號的呢!! 好吧,還有readUnsignedByte方法
常量池中的CONSTANT_Long和CONSTANT_Double是8byte數據,其之后的一個常量池位置,是不可使用的,必須跳過. 貼一下JVM標準的中的描述:
All 8-byte constants take up two entries in the constant_pool table of the class ?le. If a
CONSTANT_Long_info or CONSTANT_Double_info structure is the item in the
constant_pool table at index n, then the next usable item in the pool is located at index
n +2. The constant_pool index n +1 must be valid but is considered unusable.
有個小注釋:** In retrospect, making 8-byte constants take two constant pool entries was a poor choice.** 好吧,愚蠢的選擇,但這是歷史遺留問題了…
提醒: 這個類無法獲取接口的形參,因為接口的class文件并不保存變量名
blog comments powered by Disqus
總結
以上是生活随笔為你收集整理的java 怎么获取形参名_获得方法形参名称列表 -- 哦也,搞定!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据学情分析_多分学情大数据分析
- 下一篇: github gis 路径规划_Apol