【问题标题】:How to get method signatures from a jar file?如何从 jar 文件中获取方法签名?
【发布时间】:2010-11-01 20:39:47
【问题描述】:

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

【问题讨论】:

    标签: java jar reverse-engineering method-signature


    【解决方案1】:

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

    例如,如果您在 jar myjar.jar 中有一个名为 mypkg.HelloWorld 的类,则像这样运行它

    javap -classpath myjar.jar mypkg.HelloWorld
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 同意。非常强大的组合。
      【解决方案3】:

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

      我认为其他 IDE 也可以做类似的事情。

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

      【讨论】:

        【解决方案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()); 
                        } 
                    } 
                } 
            } 
        } 
        

        如果您使用来自 here 的改编 WALA 版本,它也适用于 Dalvik(例如 Android 应用程序)。

        【讨论】:

        • 有趣的方法,虽然有些类没有被加载。我尝试使用IClassHierarchy cha = ClassHierarchy.makeWithPhantom(scope);,但有几个例外。也许,我需要配置一些更依赖的库,但不能完全确定这是否是问题所在。
        【解决方案5】:
        • Eclipse 会很好用

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

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

        【讨论】:

          【解决方案6】:

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

          new classname().press ctrl+space 在 Eclipse 中列出方法。

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-09-19
              • 1970-01-01
              • 1970-01-01
              • 2012-01-21
              • 1970-01-01
              • 2020-04-21
              • 2017-10-07
              相关资源
              最近更新 更多