看到一个问题,"一个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;
}
}
}
}
}
分享到:
相关推荐
JarClassSearch class 文件搜索工具,可以查找出指定名称的class出现了那些jar包中 对jar包上了数量的工程特别有用,而且是GUI界面的 真是人见人爱,见人爱人,javaer 的居家旅行必备
2.搜索分析指定路径下所有jar包中是否存在指定文件。譬方说要在jar包中查询目个**.class文件。用户可以不用打开Jar包,直接输入路径和要查找的文件即可搜索。 3.除了对Jar包进行搜索分析外,还可以对zip包进行分析 4...
1.搜索分析指定路径下所有jar包中是否存在指定文件。譬方说要在jar包中查询某个**.class文件。用户可以不用打开Jar包,直接输入路径和要查找的文件即可搜索。 2.列出指定路径下的所有Jar包文件 3.除了对Jar包进行...
在Spring MVC项目中,加载jar包中的Spring配置文件是一个常见的需求,特别是在进行SSM(Spring、Spring MVC、MyBatis)整合时。SSM框架的整合通常涉及到多个配置文件的组织和管理,其中一部分配置可能会被打包到独立...
`JarSearchFile`可能是一个命令行工具或者库,它的主要功能是在给定的文件夹结构中遍历所有的`jar`文件,并根据用户提供的类名或文件名搜索对应的`.class`文件。这个工具通常具备以下特性: 1. **递归搜索**:`...
遇到jar包冲突时,需要找某个class文件在哪几个jar包中,可以用这个工具进行查找,很快速方便的
`jclasslib`是一款强大的反编译器和字节码查看器,它允许开发者查看并修改JAR文件中的`.class`文件。这篇文章将深入探讨如何使用`jclasslib`来操作包含其他JAR的复杂项目。 首先,了解`jclasslib`的基本功能。它...
当我们的应用程序被打包成JAR文件后,有时我们需要从JAR内部读取配置文件,例如application.properties或application.yml。本文将深入探讨如何在Spring框架中实现这一功能。 首先,理解Spring的资源配置。Spring...
总的来说,jarsearch-eclipse插件是Eclipse开发者必备的工具之一,尤其对于那些经常需要在大量jar和war包中查找特定class的开发者来说,它可以显著提升工作效率,简化工作流程。尽管"plugins"文件名没有提供具体信息...
此外,`URLClassLoader`可以加载jar包中的类,使得运行时能动态使用jar中的类。 3. 命令行工具:`jar`命令是Java SDK自带的工具,可用于创建、更新和提取jar文件。例如,`jar tf myjar.jar`可以列出jar包内的所有...
它通过遍历jar包中的所有class文件,检查它们的字节码来查找目标字段。这对于解决“类找不到”或者确认依赖是否正确引入的问题非常有帮助。 2. **grep-jar** `grep-jar`类似于Linux的`grep`命令,但它是专门用于在...
2. **搜索功能**:内置搜索功能使得查找特定类或方法变得简单。 3. **代码高亮**:源代码显示带有语法高亮,便于阅读和理解。 4. **跨平台**:尽管示例中给出的是Windows版本,JD-GUI也有适用于Mac OS X和Linux的...
CodeReviewTools :party_popper: 介绍 ...通过正则直接反编译拥有特定groupId的jar包到某个目录 CodeReviewTools v1.0 by Ppsoft1991 usage: java -jar CodeReviewTools.jar -m -d,--dir <arg> ta
在Java开发过程中,经常需要定位一个特定的类(Class)存在于哪个JAR包中,特别是在大型项目或依赖众多的环境中。Eclipse作为一个流行的Java集成开发环境(IDE),提供了丰富的插件来增强其功能,其中"eclips插件,...
5. **提取文件**:用户可以直接从JAR包中提取所需的文件,以便在其他地方使用或进一步分析。 6. **编辑与创建**:虽然不是所有JAR查看器都支持,但一些高级工具也允许用户编辑现有JAR文件,甚至创建新的JAR包,这在...
JVM加载class文件的原理机制是Java中的核心机制之一,由于Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器所做的工作实质是把类文件从硬盘读取到内存中。 类加载机制 ...
4. 在源代码查看区,你可以浏览和搜索jar包中的类文件源代码,无需手动保存,直接查看即可。 值得注意的是,反编译Java代码可能会涉及到版权问题,因此在未获得版权所有者许可的情况下,不应随意反编译和使用他人的...
在Java开发过程中,有时我们需要查看或理解某个库函数的具体实现,这时就需要查看jar包中的源文件。Eclipse作为一款强大的Java集成开发环境(IDE),提供了查看jar源代码的功能。本教程将详细介绍如何在Eclipse中...
- **Included resources**: 你可以选择要包含在JAR包中的额外资源文件,比如配置文件、图片等。 - **Libraries**: 选择需要打包进JAR的所有依赖库。FatJar会自动处理这些依赖,将它们合并到一个单一的JAR文件中,...
快速搜索jar包中的类 在jar包中找到config.properties 其中 dirPath设置jar包所在的文件夹 indexDir设置索引所在的文件夹。 打开cmd ,输入java -jar 该jar包的路径 例如:java -jar D:\work\自己\everyclass\...