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

时间:2009-06-10 15:33:17

标签: java jar reverse-engineering method-signature

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

7 个答案:

答案 0 :(得分:55)

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

例如,如果jar mypkg.HelloWorld中有一个名为myjar.jar的类,那么就像

一样运行它
javap -classpath myjar.jar mypkg.HelloWorld

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

答案 1 :(得分:5)

正如斯科特所说,你可以使用Eclipse来获得你想要的很多东西。

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

答案 2 :(得分:4)

如果你正在使用eclipse,你可以将它添加到项目的类路径中,并使用树视图和/或内容辅助来探索它。

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

  • Eclipse会很棒

  • A Java Decompiler会将类转换回一些源代码的序列,您可以学习这些源代码来学习类,方法,签名,甚至可能对某些参数的有效值有所了解(例如,不要为此参数传递null,否则您将立即触发NullPointerException)。但是卷起袖子来解开jar并对所有类文件运行反编译器。这基本上就是Eclipse正在为未记录的类提供帮助文本。

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

答案 5 :(得分:2)

快速帮助了解正常类(非抽象类)的方法,我会做以下几点。

new classname()。按ctrl + space查看eclipse中列出的方法。

答案 6 :(得分:0)

使用Eclipse> Package Explorer可以查看类和层次结构。

内容辅助(自动完成功能(ctrl + space))也是一个很好的帮助,但不会使用未发布的API推荐