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 file. 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 怎么获取形参名_获得方法形参名称列表 -- 哦也,搞定!!相关推荐

  1. 获取当前正在执行的方法的名称

    本文翻译自:Getting the name of the currently executing method 有没有办法在Java中获取当前正在执行的方法的名称? #1楼 参考:https://s ...

  2. 高级 | Java中获取类名的3种方法

    转载自 高级 | Java中获取类名的3种方法 获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里面的class的类名表现形式. getCanonical ...

  3. java spring获取bean_普通Java类获取Spring的Bean的方法

    普通Java类获取Spring的Bean的方法 在SSH集成的前提下.某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象. 之前我在网上找了好几好久都没有找到合适的方 ...

  4. java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...

    Java基础 5.1.1. JAVA 异常分类及处理 5.1.1.1. 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下 会抛出一个封装了错误信息的对象.此时, ...

  5. java中获取项目名的方法

    获取项目URL路径 在后端java类中写 tomcat配置的当前项目访问地址是192.0.0.1:8080/Project request.getContextPath()得到的就是192.0.0.1 ...

  6. 你如何在java中获取线程堆_如何在Windows上获取未在控制台中运行的Java进程的线程和堆转储...

    问题 我有一个Java应用程序,我从控制台运行,然后控制台执行另一个Java进程.我想获得该子进程的线程/堆转储. 在Unix上,我可以做akill -3 但是在Windows AFAIK上获取线程转 ...

  7. java怎么获取城市气温_获取城市天气数据

    中华万年历API 抓包中华万年历得到的接口(JSON): http://wthrcdn.etouch.cn/weather_mini?city=北京 通过城市名字获得天气数据,json数据 http: ...

  8. java反射获取参数名,100%好评!

    前言 数据库相关的面试题早已成为了一线互联网大厂面试的家常菜,如果你对数据库不太熟悉,我劝你不要轻易面试大厂.那么,为什么数据库成了大厂面试的家常菜呢?主要原因当然还是海量数据. 无论对于刚入行的小白 ...

  9. java 文件去除扩展名_使用Java删除所有带扩展名的文件

    我(相对)是 Java的新手,我正在尝试实现一个运行命令列表的.jar,在Windows XP的命令提示符下它将是: cd\ cd myfolder del *.lck /s 我的(失败)尝试: // ...

最新文章

  1. Python 字典(Dictionary) copy()方法
  2. c#对oracle操作时候 出现的乱码问题。
  3. 010_Raphael事件
  4. python调用github_Pycharm中使用GitHub
  5. 记录一个自动创建分区的脚本
  6. [备忘]Visual Studio常用小技巧
  7. 漫话:如何给女朋友解释什么是元宇宙?
  8. 利用Python定时给女友微信发送今日天气情况,异地恋维护感情神器
  9. 家人重病什么心情都没了
  10. Math: Fibonacci
  11. 【C++ Primer】第五章学习笔记(循环和关系表达式)
  12. 2019四川大学第二届SCUACM新生赛题解
  13. linux自带的cpu监测工具,Linux CPU实时系统监控工具mpstat
  14. python 批量下载地理空间数据云
  15. flyway 社区版本使用团队(企业级)特性ignore-migration-patterns使用
  16. js 声明——有无var的区别
  17. 计算机考研数学和英语难吗,英语难还是数学难
  18. Driver/library version mismatch
  19. 百度大脑3月新品推荐:EasyDL视频目标追踪全新发布
  20. pixiv的服务器信息,Pixiver™

热门文章

  1. pyecharts 绘制地图
  2. 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统
  3. 设置窗口置顶_这三个应用,每一个都能让你置顶。
  4. 服务器装系统用哪个好,服务器系统重装用哪个系统
  5. xlwings 合并单元格 读取_xlwings,让excel飞起来
  6. python根据矩阵数值大小涂上不同深浅颜色
  7. 利用xlwt写excel并进行单元格的合并
  8. Verilog HDL语言设计4个独立的非门
  9. React Native官方DEMO
  10. WordPress环境配置与安装