- 浏览: 322249 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
wangyonglin1123:
完美解决 谢谢您
BufferedReader中文乱码解决 -
wangyonglin1123:
StringBuilder result = new Stri ...
BufferedReader中文乱码解决 -
u011110982:
楼主,代码呢?
PKI体系简易JAVA实现(一):时间戳服务器TSA -
WangSongYuan:
我也遇到楼主一样的问题 果然在<body>后面填一 ...
Extjs IE8 对象不支持此属性或方法的bug -
ocaicai:
https://gist.github.com/wendal/ ...
JAVA获取方法参数名的分析(二)
2010年5月13日 魏超
javac和Eclipse编译出来的class文件在传入参数名称上的区别
在上文中可以看出,由javac编译的类,IDE在引用了改类的时候,无法获得方法传入参数原来的命名,只能重新赋予arg0,arg1之类的名字。而由eclipse(MyEclipse)编译出来的class文件,却具有传入参数原来的名字。
为了能进一步清楚这个区别,我们这里借助一个软件来查看class文件:JClassLib
我这里只使用了jclasslib的GUI那个版本。jclasslib作为一个java库还可以有更多更强大的功能。用jclasslib分别打开2个class文件,如下图:
上图可以看出,2个class文件相同的testJar方法下,下面那个testJar方法中还注入了"[1]LocalVariableTable"属性。这个属性通过右边的详细可以看出,存储的就是jarName和yourName2个传入参数的名字。而上面那个javac编译出来的class是没有这个属性的。
对于没有注入参数名称的class,按照我的推断,他应该是根据
上面这个方法中的Descriptor这个标志来判断传入参数是什么类型的,再根据类型给一个默认的名称。
注:上图中用红色框起来的descriptor的意思是 <(参数1数据类型,参数2数据类型) 方法返回类型>
因此,我们使用Eclipse等IDE在调用spring.jar等jar的方法时,代码提示可以正确读取到传入参数的原命名是因为 spring.jar等jar包在编译时就向class文件注入了参数名字。因此,eclipse等IDE也是通过读取.class的字节码来获得方法的参数名称的。
通过网上资料得知,eclipse\myEclipse并没有引用sun默认的javac编译器,而是有自己的实现,因此在编译java文件的时候,由eclipse编译出来的与由javac编译出来的就有所不同。
Eclipse/MyEclipse中 .class没有注入参数名称的jar在 attach source之后的区别
上一节的分析,我们了解到,倘若在生成.class文件的时候没有注入参数名称的信息,那么在引入这个class之后,使用它类的方法时,代码提示的参数就只会是arg0,arg1之类的名称。但当我们对这个引入的jar包进行了 attach source之后,代码提示的时候就可以按照source中的正确参数名称来显示。
是不是attach source之后,IDE向jar包中写入了参数名称的信息?
用jclasslib打开attach source以后的class.可以发现这个.class没有发生变化。那么还有一种可能性,就是进行了这个操作之后,eclipse再进行代码提示的时候,是直接从source中读取参数名称的。为了验证这点,我们修改source中方法的参数名。将jarName改成jarNameTest. 再次使用代码提示,可以看到,原来的参数名字没有发生变化。因此,IDE并没有每次都从sourc中读取参数的名称。而是在attach的时候读取了一次,之后做了缓存。
看到这里,我的第一个反应是eclipse在这个工程的目录下保存了类似“索引”的东西,将方法参数对应的名称保存了下来。针对这个猜测,我监测了attach前后的工程目录情况,如下图:
发生变化的只有.classpath文件。source的路径被写到了这个文件中。因此,IDE并没有建立索引。那么可以猜测,eclipse可能在内存中做了缓存,也可能是在自己的公共目录下建立了索引。
对于在内存中缓存的可能,我们只要杀死eclipse的进程便可以验证(重启eclipse).结果发现,参数名称变成了修改后的。那么可以看出,这个参数名称的缓存,eclipse是放在自己开辟的一块内存空间内的,只是临时的。在失去了这个缓存之后就会重新读取。
小结
通过上面的分析,我们可以得出一个结论,eclipse等IDE在代码提示时对方法参数名称的获取,有2种途径。
A.当.class文件中持有 参数名称 信息的时候,会直接从class中读取。
B.当没有时,从.java源文件中,通过字节流读取参数名称,然后缓存起来。
因此,我们要模仿IDE的做法,获得一个方法的传入参数名称,我们有上面2种途径。具体的实现,在下一篇心得里会继续分析。
评论
1.使用javassist.jar 这个项目可以帮助你解决这个问题,它是一个增强的反射工具。
项目地址http://www.csg.is.titech.ac.jp/~chiba/javassist/
使用例子http://www.blogjava.net/Hafeyang/archive/2010/10/25/using_powerful_java_reflect_tool_javassist_to_getParameterAnnotations_and_getParameterNames.html
但是这个工具的运行效率没有ASM高。
你也可以使用ASM来扫描Class文件这样获取你要的属性名,前提是你需要对 Class字节码有比较深入的了解。
我更趋向于使用后者,但是ASM的API没有javassist方便。
我也关注这个问题.
在我的Web框架中,我需要根据参数名称自动到Request中的parameter中取得参数值.
最后没办法我在每个参数上加了标注信息解决这个问题.
你也可以借鉴一下.
public JSONObject updateFunctionMenuTree(@Para("moduleId") String moduleId ,@Para("roleIdCommaStrForMenu") String roleIdCommaStr,@Para("state") String state) { System.out.println(state); List<String> menuIdList=menuAndFunctionDao.getAllMenuId(moduleId); String[] roleIdArr=roleIdCommaStr.split(","); System.out.println(roleIdArr.length); int addItemCount=0; for (int i = 0; i < roleIdArr.length; i++) { addItemCount=securityManager.tempAddSecurityMenuIdForRole(roleIdArr[i], menuIdList); } consoleTreeMenuBuilder.reloadTreeMenu(moduleId); JSONObject object=new JSONObject(); object.put("msg", "成功更新功能菜单树 ! "+(addItemCount==0?"":"\n并为选中角色临时添加了 "+addItemCount+" 项菜单的操作权限 ! ")); return object; }
在JAVA 7.0 中,编译时就不会丢掉参数名称信息了.据说.这个说法源于:http://www.ibm.com/developerworks/cn/java/j-javaroundtable/index.html
发表评论
-
JVM 垃圾回收机制与GC性能调优
2011-11-14 10:00 1259一篇还不错的分析。网上可查到很多转载,原文系谁所作已不可 ... -
事务相关总结记录
2011-09-21 16:35 1271查问题过程中,仅对一些东西做下记载。 在总体事务结束前 ... -
JAVA远程调试tomcat、WebSphere
2011-08-04 11:35 5909习惯于直接在eclipse里对 ... -
Ubuntu11.04Server64安装websphere mq 64位
2011-07-18 15:07 2751环境: Ubuntu-11.04-Server-64位 ... -
《Java Collections Framework》文摘及总结
2011-07-11 18:32 01. * The Collection interfa ... -
Maven eclipse debug
2011-04-12 15:24 1077mvn -Dwtpversion=2.0 eclipse:ec ... -
for和Iterator比较
2011-01-21 13:05 1803小记: 2种方式的速度和被操作数据集的类型有关系。 ... -
Appfuse所加载的jar包的作用
2010-06-30 10:50 0最近想深入学习下Appfuse框架。从官网上下了一个Sprin ... -
Ant propertyregex无返回值的问题
2010-05-31 15:58 4262<propertyregex property=&quo ... -
JAVA获取方法参数名的分析(一)
2010-05-13 10:09 138592010-5-12 魏超 关于题目 首先解 ... -
spring配置文件中对bean的id和name设置的区别
2010-05-11 10:32 1966我一直认为spirng的bean只能配置一个Id. 事实上,b ... -
关于子类和父类实现同一个接口
2010-05-04 11:20 5250这个问题是由下面的代码引出的: public c ... -
轻量级缓存 EhCache 简介
2010-04-26 10:29 1645转载自:http://blog.csdn.net/teed ... -
使用statCVS
2010-01-12 16:04 1510现在的项目里用CVS做版 ... -
Collection和Collections的区别
2009-10-19 16:37 1427Collection是个java.util下的接口,它是各种集 ... -
sleep和wait的区别
2009-10-19 16:34 61461、这两个方法来自不同的类分别是Thread和Object ... -
Apache、Tomcat、JBoss、WebLogic的区别与关系
2009-10-19 16:20 10954Apache全球应用最广泛的http服务器,免费,出自ap ... -
BufferedReader中文乱码解决
2009-10-15 11:00 70445做一个从windows cmd截获命令返回值的java程序,结 ... -
Swing Synth外观定制UI
2009-10-14 13:44 1803本文将深入透视 Synth 外 ... -
Eclipse 中警告:不能读取 AppletViewer 的属性文件解决
2009-10-14 10:18 2468警告:不能读取 AppletViewer 的属性文件: C:\ ...
相关推荐
1基于蓝牙的项目开发--蓝牙温度监测器.docx
AppDynamics:性能瓶颈识别与优化
xtrabackup银河麒麟v10rpm安装包
2024年全球产品经理大会(脱敏)PPT合集,共34份。 1、AI 原生产品设计的 7 个反共识 2、AI 时代的策略产品与内容社区推荐实践 3、AI时代的用户界面设计 4、AI智能陪练:大模型赋能销售成长 5、AI浪潮中的应用主义者 6、AI驱动下的B端产品的思考与创新 7、AI驱动业务增长的探索与实践 8、Al Native 生产力工具的发展、价值与商业落地 9、B端产品设计避坑指南 10、GenAl驱动的xGen电商AI平台产品实践与思考 11、Kwaipilot 在快手的落地实践 12、OPPO AI的探索新交互到新生态 13、RPA + AI打造大模型驱动的领先数字员工 14、产品AI化重塑的思考与实践 15、产品分析:通过关键指标助力团队与企业成功 16、从RPA到Al Agent,高价值、可落地的智能助手 17、从流量运营到AI驱动的机器增长 18、做穿越时代的产品 19、创造好工具,创造世界一流产品力 20、医疗健康场景的大模型产品探索 21、即时零售柔性供应链体系建设与AIGC在零售数字化的探索 22、向量数据库的出海实践与未来展望 23、大模型在B端落地思考实践
基于物联网技术的停车场智能管理系统设计用户有单独APP
Adobe XD:AdobeXD高级技巧与最佳实践.docx
ARKit(iOS的增强现实):ARKit的多人AR场景实现
1python自动化脚本.docx
河北省、市、区县及街镇可编辑SVG图
金融工程之量化交易算法:均值回归:时间序列分析与预测.docx
技术资料分享ADV7123非常好的技术资料.zip
Sawmill_cn.ppt
使用LabVIEW输入数字n,然后计算n的阶乘
1无人值守灌溉系统--stm.docx
金融工程之量化交易算法:动量交易:金融数据获取与处理.docx
基于SSM的毕业设计源码
头像图片调试使用用来调试
GITS_sawmill8.5.8.1_x64_linux-ubuntu11.tar.gz
Newspaper 是一个专为新闻、杂志和内容丰富网站设计的 WordPress 主题。它非常适合博客、在线出版和内容展示,具备多种强大功能。以下是 Newspaper 的主要特点: 响应式设计:确保网站在各种设备上(手机、平板、桌面)都能良好显示,优化用户体验。 丰富的预建模板:提供多个专业设计的预建布局和页面模板,用户可以快速导入并根据需求进行修改。 强大的页面构建器:内置的 TagDiv Composer 允许用户通过拖放功能轻松创建和自定义页面,无需编写代码。 SEO 优化:主题经过优化,有助于提升网站在搜索引擎中的排名,增加流量。 多种内容展示选项:提供多种文章格式和布局选项,如网格、列表、视频和画廊,方便展示不同类型的内容。 社交媒体集成:支持社交媒体分享功能,帮助用户轻松与观众互动并提高网站的曝光度。 实时自定义:支持实时预览功能,用户可以在更改设置时即时查看效果。 持续更新和支持:定期更新主题,确保用户获得最新功能和安全性,同时提供专业的技术支持。
国内市场:功能化脂质市场现状研究分析与发展前景预测报告(2024版).docx