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 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 怎么获取形参名_获得方法形参名称列表 -- 哦也,搞定!!相关推荐
- 获取当前正在执行的方法的名称
本文翻译自:Getting the name of the currently executing method 有没有办法在Java中获取当前正在执行的方法的名称? #1楼 参考:https://s ...
- 高级 | Java中获取类名的3种方法
转载自 高级 | Java中获取类名的3种方法 获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里面的class的类名表现形式. getCanonical ...
- java spring获取bean_普通Java类获取Spring的Bean的方法
普通Java类获取Spring的Bean的方法 在SSH集成的前提下.某些情况我们需要在Action以外的类中来获得Spring所管理的Service对象. 之前我在网上找了好几好久都没有找到合适的方 ...
- java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...
Java基础 5.1.1. JAVA 异常分类及处理 5.1.1.1. 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下 会抛出一个封装了错误信息的对象.此时, ...
- java中获取项目名的方法
获取项目URL路径 在后端java类中写 tomcat配置的当前项目访问地址是192.0.0.1:8080/Project request.getContextPath()得到的就是192.0.0.1 ...
- 你如何在java中获取线程堆_如何在Windows上获取未在控制台中运行的Java进程的线程和堆转储...
问题 我有一个Java应用程序,我从控制台运行,然后控制台执行另一个Java进程.我想获得该子进程的线程/堆转储. 在Unix上,我可以做akill -3 但是在Windows AFAIK上获取线程转 ...
- java怎么获取城市气温_获取城市天气数据
中华万年历API 抓包中华万年历得到的接口(JSON): http://wthrcdn.etouch.cn/weather_mini?city=北京 通过城市名字获得天气数据,json数据 http: ...
- java反射获取参数名,100%好评!
前言 数据库相关的面试题早已成为了一线互联网大厂面试的家常菜,如果你对数据库不太熟悉,我劝你不要轻易面试大厂.那么,为什么数据库成了大厂面试的家常菜呢?主要原因当然还是海量数据. 无论对于刚入行的小白 ...
- java 文件去除扩展名_使用Java删除所有带扩展名的文件
我(相对)是 Java的新手,我正在尝试实现一个运行命令列表的.jar,在Windows XP的命令提示符下它将是: cd\ cd myfolder del *.lck /s 我的(失败)尝试: // ...
最新文章
- Python 字典(Dictionary) copy()方法
- c#对oracle操作时候 出现的乱码问题。
- 010_Raphael事件
- python调用github_Pycharm中使用GitHub
- 记录一个自动创建分区的脚本
- [备忘]Visual Studio常用小技巧
- 漫话:如何给女朋友解释什么是元宇宙?
- 利用Python定时给女友微信发送今日天气情况,异地恋维护感情神器
- 家人重病什么心情都没了
- Math: Fibonacci
- 【C++ Primer】第五章学习笔记(循环和关系表达式)
- 2019四川大学第二届SCUACM新生赛题解
- linux自带的cpu监测工具,Linux CPU实时系统监控工具mpstat
- python 批量下载地理空间数据云
- flyway 社区版本使用团队(企业级)特性ignore-migration-patterns使用
- js 声明——有无var的区别
- 计算机考研数学和英语难吗,英语难还是数学难
- Driver/library version mismatch
- 百度大脑3月新品推荐:EasyDL视频目标追踪全新发布
- pixiv的服务器信息,Pixiver™