- 浏览: 319149 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
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-12 魏超
关于题目
首先解释一下题目. 我们知道, Java通过反射,可以从一个类得知它有哪些方法,有哪些变量,也可以知道每个方法中有哪几个什么类型的传入参数。但有一个东西反射取不到,那就是我们对方法传入参数的命名。
取得传入参数的名字有什么意义?
对这个问题的探究,源于在写一个测试类时候的需求。假设我们有一个类需要测试,这个类中有数十个方法。为每个方法编写测试类,将耗费大量的时间和精力。因此我有一种想法,就是通过java的反射,获得这个类所有的方法,再通过传入参数的名字和参数类型,来生成一些符合要求的数据进行传入。(能这样生成数据的前提是:这个类的编码需要遵循严格的规范,对参数的命名有统一的标准,同时,这个类应该和某种业务紧密相关,这样,才能通过业务和参数名字,判断应生成什么合适的数据)。如果能做到上面说的,那么对具有数十或数百个方法的类,要测试的话只需要传入这个类就可以了。
存在的问题
根据上面的设想,问题就出现了。获得类的方法,获得类的参数类型,反射都可以做到。但参数名称呢?上网求证,多数人给了直接否定的答案。因为API中根本没有提供相关的方法。但有一些人的观点启发了我。他们提到,IDE(如eclipse,myeclipse)中在编码过程中,调用一个类的方法,在代码提示的时候,ide是可以显示出方法中的参数名字的,如下图:
IDE是怎样做到的呢,如果IDE可以做到,我们是否可以尝试去分析它们的做法,来获得参数名称。
可能的做法
网上找到了一个很直观的方法——通过直接读取.java文件,把类作为一个普通文本,用正则表达式匹配方法,来直接获取参数的名字。
/** * @author zhangc * *一个测试程序,用来扫描文件(java文件),找出所有方法的参数列表 */ import java.io.*; import java.util.regex.*; public class ScanSource { static void findArgsList(Object targetSrc) { /* * 正则匹配串基本上是这样子分组情况(A(B(c(d)))) * 串是:(\\w+\\s+\\w+\\s*\\(((\\s*\\w+\\s*(\\[ * \\])*\\s*\\s+(\\[\\])*\\s*\\w+\\s*(\\[\\])*,?)+)\\)\\s*\\{) 比如public * static void findArgsList(Object targetSrc,int []a){ * A是匹配整个方法定义行:这里是:static void findArgsList(Object targetSrc,int []a){ * B是匹配匹配参数列表:这里是Object targetSrc,int []a * C是匹配一个参数,包括类型和类型名称和逗号:这里是Object targetSrc, D是匹配数组标识符:这里是[] * 这个串有点bt,水平有限,只能这样 */ Pattern p = Pattern .compile("(\\w+\\s+\\w+\\s*\\(((\\s*\\w+\\s*(\\[\\])*\\s*\\s+(\\[\\])*\\s*\\w+\\s*(\\[\\])*,?)+)\\)\\s*\\{)"); Matcher m = p.matcher((CharSequence) targetSrc); // locate the all methord defination while (m.find()) { String methodName = m.group(0); String methodArgName = m.group(1); String strArgs = m.group(2); String fourArgs = m.group(3); System.out.println(methodName + "\n" + methodArgName + "\n" + strArgs + "\n" + fourArgs + "\n"); } } public static String LoadTargetFile(String targetFileName) { String result = null; try { FileInputStream fis = new FileInputStream(targetFileName); // 临时分配10000size给byte数组。 byte[] bufReceived = new byte[10000]; int counts = fis.read(bufReceived); byte[] bufActual = new byte[counts]; System.arraycopy(bufReceived, 0, bufActual, 0, counts); result = new String(bufActual); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } public static void main(String[] args) { String target = LoadTargetFile("src/com/spring/aop/TestAspect.java"); System.out.println(target); findArgsList(target); } }
这个通过正则表达式的类,在我写的一个简单的测试类中,是可以取得参数的值的,但当把它用在我们那个有几十个方法的类的时候,表达式的匹配就失效了,没有得到任何的结果(具体原因可能是正则表达式的错误,没能匹配到一些方法)。同时,这种方法需要有.java这个源文件,而在IDE中引入的常常是.class组成的Jar包。为了进一步了解IDE对方法传入参数名的处理,下面我做了一个测试。
测试IDE对方法传入参数的处理
建立一个工程。在工程中新建如下的一个类:
package testplugin; public class TestJar { public void testJar(String jarName, String yourName){ System.out.println("jarName:" + jarName + "|| yourName:" + yourName); } }
接着我们用2种方式对这个类打jar包:
1. 用javac编译类文件然后打到jar包中,命名为testPlugin_javac.jar.
2. 用MyEclipse直接对工程进行导出,导出为testPlugin_myeclipse.jar.
(打开2个jar中的TestJar.class文件,会发现2个class文件有差异)。
再建立一个工程,先后将2个jar包引入做实验,可以看到:
1. 引入testPlugin_javac.jar, 调用testJar方法,如下图
可以看到,2个传入参数失去了原有的名称。
2. 移除上面的包,引入testPlugin_myEclipse.jar, 调用testJar方法,如下图
可以看到,参数名称被识别出来了。
关键在于,2个jar包中的class文件不同。我们打开2个class文件(我们只是直观的看一下class文件中的变量,所以没有用专用的工具查看):
javac生成的.class:
myelipse直接打出来的.class(实际上就是调用了debug模式编译出来的.class):
2个class文件里下面的部分都有SourceFile块。应该是用来表示这个class文件是从哪个java文件编译来的。我们重点看上面的部分。
可以看到,用普通的javac编译出来的类,方法的传入参数名会被编译器修改,于是上面第一个图里SourceFile以上的部分就找不到jarName和yourName 2个名字。而只有通过-debug模式编译出来的类,它的参数名才能被保存下来。而也就是在.class文件中有保留下来参数名的jar包,在IDE中代码提示才能正确显示出参数名字。
那么说明IDE是否能识别类中的方法名取决于编译过后产生的不同的class文件。那么下一节我们会使用工具来解析这2个class文件来看其中到底有什么不同。
发表评论
-
JVM 垃圾回收机制与GC性能调优
2011-11-14 10:00 1222一篇还不错的分析。网上可查到很多转载,原文系谁所作已不可 ... -
事务相关总结记录
2011-09-21 16:35 1237查问题过程中,仅对一些东西做下记载。 在总体事务结束前 ... -
JAVA远程调试tomcat、WebSphere
2011-08-04 11:35 5871习惯于直接在eclipse里对 ... -
Ubuntu11.04Server64安装websphere mq 64位
2011-07-18 15:07 2716环境: 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 1039mvn -Dwtpversion=2.0 eclipse:ec ... -
for和Iterator比较
2011-01-21 13:05 1761小记: 2种方式的速度和被操作数据集的类型有关系。 ... -
Appfuse所加载的jar包的作用
2010-06-30 10:50 0最近想深入学习下Appfuse框架。从官网上下了一个Sprin ... -
Ant propertyregex无返回值的问题
2010-05-31 15:58 4227<propertyregex property=&quo ... -
JAVA获取方法参数名的分析(二)
2010-05-13 14:29 79632010年5月13日 魏超 上一节:JAVA获取方法参 ... -
spring配置文件中对bean的id和name设置的区别
2010-05-11 10:32 1916我一直认为spirng的bean只能配置一个Id. 事实上,b ... -
关于子类和父类实现同一个接口
2010-05-04 11:20 5183这个问题是由下面的代码引出的: public c ... -
轻量级缓存 EhCache 简介
2010-04-26 10:29 1611转载自:http://blog.csdn.net/teed ... -
使用statCVS
2010-01-12 16:04 1443现在的项目里用CVS做版 ... -
Collection和Collections的区别
2009-10-19 16:37 1386Collection是个java.util下的接口,它是各种集 ... -
sleep和wait的区别
2009-10-19 16:34 61091、这两个方法来自不同的类分别是Thread和Object ... -
Apache、Tomcat、JBoss、WebLogic的区别与关系
2009-10-19 16:20 10898Apache全球应用最广泛的http服务器,免费,出自ap ... -
BufferedReader中文乱码解决
2009-10-15 11:00 70367做一个从windows cmd截获命令返回值的java程序,结 ... -
Swing Synth外观定制UI
2009-10-14 13:44 1767本文将深入透视 Synth 外 ... -
Eclipse 中警告:不能读取 AppletViewer 的属性文件解决
2009-10-14 10:18 2434警告:不能读取 AppletViewer 的属性文件: C:\ ...
相关推荐
企业数字化转型暨数据仓库(数仓)建设方案.pptx
2024年中国LED切割灯行业研究报告
在当今快速发展的人工智能领域中,一款集成了机器学习、深度学习、神经网络、图神经网络、卷积网络及多层感知机可视化功能的画图工具脱颖而出,成为全球范围内最受欢迎和认可的工具之一。这款工具不仅仅是一个简单的绘图软件,它的设计初衷是为了让复杂的网络结构和算法直观化,从而帮助研究者、学者及开发人员更容易地理解和分享他们的工作。 最令人印象深刻的特色之一是它基于PPT的编辑能力,这允许用户在熟悉的PPT编辑环境中创建、编辑和展示复杂的网络结构。用户可以利用拖拉组件、调整尺寸、修改颜色和形状等功能,无缝地将科研成果或项目展示集成到演示文稿中,极大地提高了工作的效率和表现力。 该工具不仅支持广泛的网络结构和模型,还包含丰富的库和模块,让用户能够轻松自定义和扩展自己的模型。它的用户界面友好、直观,无论是机器学习的新手还是资深研究员,都能快速上手,将精力更多地集中在创新和研究上,而不是图形的绘制和编辑上。 此外,它强大的共享和合作功能,使得团队成员可以实时共享他们的成果,促进了知识的交流和项目的进展。这款工具不仅改善了人工智能领域内部的工作方式,也为更广泛的受众提供了学习和理解复杂算法的窗口。 总
2024年中国B型超声诊断设备行业研究报告
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
内容概要:通过带着读者手写简化版 ajax请求框架,了解网络请求核心原理。在手写ajax的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:XMLHttpRequest、jsonp请求、作用域、资源处理等内容实现。 适用人群:具备一定编程基础,工作1-3年的大前端开发、网络安全的研发人员 适用场景:金融支付、设备识别、IP 限制、网络监控、技术测试 能学到什么:手写ajax请求、兼容jsonp请求、动态添加meta标签、动态获取本地ip、处理403网络请求报错。 阅读建议:可以在以下框架中使用:react、react-native、vue、javaScript、web、jquery框架。在webapp工程,获取终端ip 获取本地ip 获取本机ip地址,403报错解决方案。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Stm32学习笔记,超详细
halcon 3D图像重建。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
虚拟网卡库,Python或者C都可以调用,虚拟网卡
IEC 60364-7-721-2017 低压电气装置.第7-721部分:特殊装置或场所的要求.房车和机动房车中的电气装置.pdf
BS 1363-1-2023 :13A插头、插座、适配器和连接装置第1部分:可重新布线和不可重新布线的13A保险丝插头规范.pdf
平安业研一体 BizDevOps—降本增效与业务价值最大化实践-龚明杰
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文
超低溫冷凍櫃 Revco RLE 系列、Forma 89000 系列、HERAfreeze HLE 系列、 Thermo Scientific TLE 系列 安裝和操作
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。