看到一个问题,"一个jar包有很多的class,但是,唯一知道的只是一个方法名,怎么样知道哪一个或哪些class拥有这个方法呢?"
我想我们可以通过如下的步骤来实现:
1. 获取jar包中所有的JarEntry
2. 检查每一个JarEntry的name,如果name是以'.class'结尾,那么,获取class名字
3. 使用第2步中得到的class名字,通过反射获取Method数组。
4. 循环Method数组,如果发现方法名与已知的方法名一致,则在控制台输出该类的class name。
基于上述思想,我写了一个小程序,并去跑了一个实例--> 在jar包
'commons-lang-2.4.jar'中查找拥有方法名 '
removeCauseMethodName' 的class。
控制台输出的结果如下:
Method [removeCauseMethodName] is included in Class [org.apache.commons.lang.exception.ExceptionUtils]
具体的代码如下:
注意: 运行如下程序之前请先把'commons-lang-2.4.jar' 添加到build path中,然后根据自己的workspace环境指定该jar包的具体路径。
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class SearchMetodInJarFile {
private static final String CLASS_SUFFIX = ".class";
public static void main(String[] args) throws IOException,
SecurityException, ClassNotFoundException {
/** target method name to be searched */
String targetMethodClass = "removeCauseMethodName";
/**
* Specify a target method name as 'removeCauseMethodName'. Find class
* name that includes the target method name in Jar File.
*/
new SearchMetodInJarFile().searchMethodName(new JarFile(
"D:\\Develop\\workspace\\Test\\commons-lang-2.4.jar"),
targetMethodClass);
}
/**
* Search target method name in multiple Jar files.
*/
public void searchMethodName(JarFile[] jarFiles, String targetMethodName)
throws SecurityException, ClassNotFoundException {
for (JarFile jarFile : jarFiles) {
searchMethodName(jarFile, targetMethodName);
}
}
/**
* Search target method name in one Jar file.
*/
public void searchMethodName(JarFile jarFile, String targetMethodName)
throws SecurityException, ClassNotFoundException {
Enumeration<JarEntry> entryEnum = jarFile.entries();
while (entryEnum.hasMoreElements()) {
doSearchMethodName(entryEnum.nextElement(), targetMethodName);
}
}
/**
* Check the name of JarEntry, if its name ends with '.class'. Then do the
* following 3 steps: 1. Populate Class name. 2. Get the methods by
* reflection. 3. Compare the target method name with the names. If the
* methood name is equal to target method name. Then print the method name
* and class name in console.
*/
private void doSearchMethodName(JarEntry entry, String targetMethodName)
throws SecurityException, ClassNotFoundException {
String name = entry.getName();
if (name.endsWith(CLASS_SUFFIX)) {
/**
* Populate the class name
*/
name = name.replaceAll("/", ".")
.substring(0, name.lastIndexOf("."));
/**
* Retrieve the methods via reflection.
*/
Method[] methods = Class.forName(name).getDeclaredMethods();
for (Method m : methods) {
/**
* Print the message in console if the method name is expected.
*/
if (targetMethodName.equals(m.getName())) {
System.out.println(String.format(
"Method [%s] is included in Class [%s]",
targetMethodName, name));
break;
}
}
}
}
}
分享到:
相关推荐
2.搜索分析指定路径下所有jar包中是否存在指定文件。譬方说要在jar包中查询目个**.class文件。用户可以不用打开Jar包,直接输入路径和要查找的文件即可搜索。 3.除了对Jar包进行搜索分析外,还可以对zip包进行分析 4...
JarClassSearch class 文件搜索工具,可以查找出指定名称的class出现了那些jar包中 对jar包上了数量的工程特别有用,而且是GUI界面的 真是人见人爱,见人爱人,javaer 的居家旅行必备
1.搜索分析指定路径下所有jar包中是否存在指定文件。譬方说要在jar包中查询某个**.class文件。用户可以不用打开Jar包,直接输入路径和要查找的文件即可搜索。 2.列出指定路径下的所有Jar包文件 3.除了对Jar包进行...
遇到jar包冲突时,需要找某个class文件在哪几个jar包中,可以用这个工具进行查找,很快速方便的
CodeReviewTools :party_popper: 介绍 ...通过正则直接反编译拥有特定groupId的jar包到某个目录 CodeReviewTools v1.0 by Ppsoft1991 usage: java -jar CodeReviewTools.jar -m -d,--dir <arg> ta
快速搜索jar包中的类 在jar包中找到config.properties 其中 dirPath设置jar包所在的文件夹 indexDir设置索引所在的文件夹。 打开cmd ,输入java -jar 该jar包的路径 例如:java -jar D:\work\自己\everyclass\...
资源中包含jad.exe以及反编译jar包,包含反编译的安装方法,使用时可以使用ctrl + 鼠标左键进入封装在jar包中的方法。具体安装方法在压缩包中的word文档中。 安装方法: 1. 将net.sf.jadclipse_3.3.0.jar 拷贝到...
修改jar包中变量 或者长量 步骤如下: 1.用jd-gui打开该jar 怎么打开不用我说了吧? 打开之后找到 要修改提示信息 的class文件 这里找到的是GenEntity 找到对应需要修改的代码所在的方法名 我这里包含提示信息的这段...
从myeclipse中打开含有class的project,通过快捷键ctrl+shift+type查找到java类文件(搜索jar包和src目录),在弹出的窗口中,输入已有的类名,双击即可看到反编译jar包中任意class文件的效果。 此外,还有一款比...
PhonegapProjectManagerImpl$2.class(搜索,删除,两个都干掉) 接下来就可以用了 想要多版本共存的,有两种方法,一种是备份 .myeclipse.properties 这个文件(保存的注册信息),然后根据你想要用的版本去换 另一...
通过maven生成一个webapp项目,例如项目名为weixin,在maven配置文件pom.xml中添加jwx依赖,jwx的1.1.1jar包已经提交到maven中心仓库,通过中心仓库搜索jwx关键字可以获取jar包依赖配置。 <groupId>...
SWT是作为Eclipse开发环境的一个插件形式存在,可以在${你的eclipse安装路径}\plugins路径下的众多子目录下去搜索SWT.JAR文件,在找到的JAR文件中包含了SWT全部的Java类文件。因为SWT应用了JNI技术,因此同时也要...
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...
包含jad.exe和net.sf.jadclipse_3.3.0.jar两个插件。将jad放入java安装包中jdk/bin中,将net.sf.jadclipse_3.3.0放入Eclipse中plugins包中。...然后在Eclipse中的窗口-首选项-中搜索jadclipse,添加路径即可
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...
自定义问候语(系统路径下dictum.rc文件,格式参见jar包中的dictum.rc文件,保存时使用UTF-8编码,可写条目为0~9/a~z/A~Z,置空时表示不显示问候语) ·修正: 0键在各偏好中切换时亮度混乱的问题 部分手机上无法...
蓝牙 (class 1) ;四频 (850 , 900 , 1800 , 1900) ;支持 3G , 802.11b 和 802.11g 。----------------------------------- Android 编程基础 5 互联网 支持 HTTP 、 WAP Push 和 xHTML ;支持 POP 、 IMAP 、 ...
14.1 Object类——所有类的超类 270 14.1.1 toString方法的重写 270 14.1.2 equals方法的意义 271 14.1.3 hashCode方法的意义 272 14.2 重写equals与hashCode方法 273 14.2.1 重写equals方法 273 14.2.2...
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...