如何从jar文件获取方法签名?

我有一个第三方的jar文件,只有部分API的javadocs。 有没有一种方法来反向工程的jar文件,以获得类和方法的完整列表?

jar tf会列出你的内容。 javap将允许您查看类的更多细节(请参阅工具指南)。

例如,如果您在jar myjar.jar有一个名为mypkg.HelloWorld的类,那么运行它就像

 javap -classpath myjar.jar mypkg.HelloWorld 

但是,您确定要使用这些未发布的API吗? 这通常是一个非常糟糕的主意。

正如斯科特所说,你可以使用Eclipse来获取许多你正在寻找的东西。

我build议获取JadClipse插件 ,它将在运行时反编译.class文件,并在浏览IDE中的类时显示实际的Java代码。

如果您使用的是Eclipse,您可以将其添加到项目的类path中,并使用树视图和/或内容辅助function进行探索。

我会假设其他的IDE可以做类似的。

从命令行的angular度来看,你可以将其解压(jar xf foo.jar)并对所有文件使用javap。

您可以使用WALA库读出所有的方法签名。 您将需要首先加载Stub-Code for Java。 下面的程序应该读出所有的签名:

 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应用程序)。

知道正常类(而不是抽象类)的方法的快速帮助,我做了以下。

新的classname()。按ctrl +空格列出日历中的方法。

  • Eclipse会很好

  • 一个Java反编译器会把这些类翻译成一些可以学习的源代码,以了解类,方法,它们的签名,甚至可以对某些参数的有效值进行一些洞察(例如,不要传递null这个参数或者你会立即触发一个NullPointerException)。 但是卷起你的袖子来开启jar并运行反编译器来处理所有的类文件。 这本质上就是Eclipse为了帮助文档和非文档类所做的事情。

  • 最后,当然, “真正的程序员”会直接读取字节码 ,而不需要反编译器。

使用Eclipse>包资源pipe理器来查看类和他们的层次结构。

内容辅助(自动完成function(Ctrl +空格))也是一个很好的帮助,但不会推荐使用未发布的API