2009-06-10 45 views
38

我有一个第三方jar文件,只有部分API的javadocs。有没有办法对jar文件进行逆向工程以获得完整的类和方法列表?如何从jar文件获取方法签名?

+2

喜欢反思? – 2009-06-10 15:37:11

回答

43

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

举例来说,如果你有一个罐子myjar.jar然后命名mypkg.HelloWorld类中运行它像

javap -classpath myjar.jar mypkg.HelloWorld 

但是,你确定你想利用这些未公布的API是什么?这通常是一个非常糟糕的主意。

3

如果您使用的是Eclipse,您可以将其添加到项目的类路径中,并使用树视图和/或内容辅助功能来探索它。

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

从命令行的角度来看,你可以取消它(jar xf foo.jar)并对所有文件使用javap。

5

正如斯科特所说,您可以使用Eclipse获取许多您正在寻找的内容。

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

+0

同意。一个非常强大的组合。 – 2009-06-10 20:53:13

1
  • 的Eclipse将工作的伟大

  • 一个Java Decompiler将类转换回源代码的一些semblence,你可以学习学习类,方法,他们的签名,并且甚至一些见解转换为某些参数的有效值(例如,不要为此参数传递null,否则将立即触发NullPointerException)。但是卷起你的袖子来解开jar并运行反编译器来处理所有的类文件。这实际上是Eclipse为帮助带有未记录类的文本所做的。

  • 最后,当然,"real programmer"会直接读取byte-code而不需要反编译器。

2

快速帮助了解一个普通类(不是抽象类)的方法,我做以下。

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

0

使用Eclipse> Package Explorer查看类和他们的层次结构。

内容辅助(自动完成功能(Ctrl +空格键))也是一个很好的帮助,但难道不建议更换使用未公开的API

3

您可以使用库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()); 
       } 
      } 
     } 
    } 
} 

如果从here使用改编WALA版本它的Dalvik(例如Android应用程序)。