Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从jar文件中获取方法签名?_Java_Jar_Reverse Engineering_Method Signature - Fatal编程技术网

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

Java 如何从jar文件中获取方法签名?,java,jar,reverse-engineering,method-signature,Java,Jar,Reverse Engineering,Method Signature,我有一个第三方jar文件,它和javadocs一起提供,仅用于API的一部分。有没有办法对jar文件进行反向工程,以获得类和方法的完整列表?将为您列出内容。将允许您查看类的更多详细信息(请参阅工具指南) 例如,如果您在jarmyjar.jar中有一个名为mypkg.HelloWorld的类,那么像 javap -classpath myjar.jar mypkg.HelloWorld 但是,您确定要使用这些未发布的API吗?这通常是一个非常糟糕的主意。如果您使用的是eclipse,您只需将其添

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

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

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

javap -classpath myjar.jar mypkg.HelloWorld

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

如果您使用的是eclipse,您只需将其添加到项目的类路径中,并使用treeview和/或内容辅助进行探索

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


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

正如Scott所说,您可以使用Eclipse来获取大量您需要的内容

我建议您在IDE中浏览类时,使用该工具动态地反编译.class文件并显示实际的Java代码。

  • Eclipse将非常有效

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

  • 最后,当然,a将直接读取,而不需要反编译器


了解普通类(非抽象类)的方法的快速帮助,我执行以下操作


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

使用eclipse>包资源管理器查看类及其层次结构

内容辅助功能(自动完成功能(ctrl+space))也是一个很好的帮助,但不建议使用未发布的API执行。您可以使用库读取所有方法签名。但是,您需要首先为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应用程序)也会使用。

同意。一个非常强大的组合。有趣的方法,尽管有些类没有被加载。我尝试使用
iclasshhierarchy cha=ClassHierarchy.makeWithPhantom(scope)虽然我有几个例外。也许,我需要配置一些更依赖的库,但不完全确定这是否是问题所在。