我有一个包含这么多* .class文件的jar文件。我需要在类文件中搜索一个方法(我现在只有我的方法名称)。
有可能吗?
答案 0 :(得分:17)
从jar文件中提取类,然后运行
unzip Classes.jar
find . -name '*.class' | xargs javap -p > classes.txt
classes.txt
文件将包含有关jar内部类的所有信息。您可以在其中搜索方法。
答案 1 :(得分:2)
您可以在method declaration
中看到Eclipse IDE
[但不是源代码]。
打开Package Explorer --> Referenced libraries
[在项目中引用]然后展开要查看类的jar的树。
在outline
窗口中,您可以看到方法声明
答案 2 :(得分:2)
您可以在winzip / winrar中打开jar并将类文件反编译为java文件。 网上有多个反编译器
答案 3 :(得分:2)
您可以使用以下步骤在Jar文件中查找包含目标方法名称的所有类名。
使用上述步骤,我们可以在jar文件中找到具有指定目标方法名称的所有类名。
我编写了一个代码并运行了一个示例,用于在jar“ commons-lang-2.4.jar ”中找到类名,目标方法名称为“ removeCauseMethodName ”。
以下消息显示在控制台中。
方法[removeCauseMethodName]包含在Class [org.apache.commons.lang.exception.ExceptionUtils]
中从消息中,我们可以看到类名,其中包括目标方法名称。
代码如下:
注意:在运行代码之前,我们需要将jar'commons-lang-2.4.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;
}
}
}
}
}
希望这可以帮到你一些。