49

我有一个第三方 jar 文件,它仅用于部分 API 的 javadocs。有没有办法对 jar 文件进行逆向工程以获得完整的类和方法列表?

4

7 回答 7

63

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

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

javap -classpath myjar.jar mypkg.HelloWorld

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

于 2009-06-10T15:38:54.030 回答
6

正如 Scott 所说,您可以使用 Eclipse 来获得很多您正在寻找的东西。

我建议获取JadClipse 插件,它可以动态反编译 .class 文件,并在您浏览 IDE 中的类时向您显示实际的 Java 代码。

于 2009-06-10T15:42:03.710 回答
5

如果您使用的是 eclipse,您只需将其添加到项目的类路径中,然后使用树视图和/或内容辅助来探索它。

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

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

于 2009-06-10T15:39:07.553 回答
4

您可以使用库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 应用程序)。

于 2013-08-16T11:13:16.687 回答
3
  • Eclipse 会很好用

  • Java 反编译器会将类翻译回一些源代码,您可以研究这些源代码以了解类、方法、它们的签名,甚至可能深入了解某些参数的有效值(例如,不要为此参数,否则您将立即触发 NullPointerException)。但是卷起袖子解压缩 jar 并对所有类文件运行反编译器。这本质上是 Eclipse 为未记录类的帮助文本所做的。

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

于 2009-06-10T16:00:29.650 回答
2

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.

于 2011-12-06T10:28:17.377 回答
0

使用 Eclipse > Package Explorer 查看类及其层次结构。

Content Assist(autocomplete feature (ctrl + space)) 也是一个很好的帮助,但不推荐使用未发布的 API

于 2012-04-01T17:19:28.220 回答