我有一个第三方 jar 文件,它仅用于部分 API 的 javadocs。有没有办法对 jar 文件进行逆向工程以获得完整的类和方法列表?
7 回答
正如 Scott 所说,您可以使用 Eclipse 来获得很多您正在寻找的东西。
我建议获取JadClipse 插件,它可以动态反编译 .class 文件,并在您浏览 IDE 中的类时向您显示实际的 Java 代码。
如果您使用的是 eclipse,您只需将其添加到项目的类路径中,然后使用树视图和/或内容辅助来探索它。
我假设其他 IDE 可以做类似的事情。
从命令行的角度来看,您可以解压缩它(jar xf foo.jar)并对所有文件使用 javap。
您可以使用库WALA读取所有方法签名。但是,您需要先为 Java 加载 Stub-Code。以下程序应读出所有签名:
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.types.ClassLoaderReference;
import java.util.jar.JarFile;
import java.io.IOException;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
public class methods {
public static void main(String[] args) throws IOException, ClassHierarchyException {
AnalysisScope scope = AnalysisScope.createJavaAnalysisScope();
scope.addToScope(ClassLoaderReference.Primordial, new JarFile("jSDG-stubs-jre1.5.jar"));
scope.addToScope(ClassLoaderReference.Application, new JarFile("myProgram.jar"));
IClassHierarchy cha = ClassHierarchy.make(scope);
for (IClass cl : cha) {
if (cl.getClassLoader().getReference().equals(ClassLoaderReference.Application)) {
for (IMethod m : cl.getAllMethods()) {
String ac = "";
if (m.isAbstract()) ac = ac + "abstract ";
if (m.isClinit()) ac = ac + "clinit ";
if (m.isFinal()) ac = ac + "final ";
if (m.isInit()) ac = ac + "init ";
if (m.isNative()) ac = ac + "native ";
if (m.isPrivate()) ac = ac + "private ";
if (m.isProtected()) ac = ac + "protected ";
if (m.isPublic()) ac = ac + "public ";
if (m.isSynchronized()) ac = ac + "synchronized ";
System.out.println(ac + m.getSignature());
}
}
}
}
}
如果您从这里使用改编的 WALA 版本,它也会使用 Dalvik(例如 Android 应用程序)。
a quick help for knowing methods of a normal class (not abstract class),I do the following .
new classname().press ctrl+space for methods listing in eclipse.
使用 Eclipse > Package Explorer 查看类及其层次结构。
Content Assist(autocomplete feature (ctrl + space)) 也是一个很好的帮助,但不推荐使用未发布的 API