我有一个第三方jar文件,只有部分API的javadocs。有没有办法对jar文件进行逆向工程以获得完整的类和方法列表?如何从jar文件获取方法签名?
回答
如果您使用的是Eclipse,您可以将其添加到项目的类路径中,并使用树视图和/或内容辅助功能来探索它。
我会假设其他IDE可以做类似的。
从命令行的角度来看,你可以取消它(jar xf foo.jar)并对所有文件使用javap。
正如斯科特所说,您可以使用Eclipse获取许多您正在寻找的内容。
我建议您获取JadClipse plugin,它将在运行中反编译.class文件,并在浏览IDE中的类时显示实际的Java代码。
同意。一个非常强大的组合。 – 2009-06-10 20:53:13
的Eclipse将工作的伟大
一个Java Decompiler将类转换回源代码的一些semblence,你可以学习学习类,方法,他们的签名,并且甚至一些见解转换为某些参数的有效值(例如,不要为此参数传递null,否则将立即触发NullPointerException)。但是卷起你的袖子来解开jar并运行反编译器来处理所有的类文件。这实际上是Eclipse为帮助带有未记录类的文本所做的。
最后,当然,"real programmer"会直接读取byte-code而不需要反编译器。
快速帮助了解一个普通类(不是抽象类)的方法,我做以下。
新的classname()。按ctrl +空格列出日历中的方法。
使用Eclipse> Package Explorer查看类和他们的层次结构。
内容辅助(自动完成功能(Ctrl +空格键))也是一个很好的帮助,但难道不建议更换使用未公开的API
您可以使用库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应用程序)。
- 1. 如何从签名文件中获取签名者的名称
- 2. 签名.Jar文件
- 3. 如何从.jar文件获取日志?
- 4. 如何从classpath获取jar文件?
- 5. 如何从JAR文件获取资源
- 6. 如何从jar中获取文件?
- 7. 已签名的应用程序文件 - 如何从文件中获取签名?
- 8. 如何使用pem文件签名jar?
- 9. 从JAR中获取文件
- 10. 如何从JavaScript文件获取方法名称
- 11. 如何从VariableDeclarationStatement获取方法名称
- 12. 如何在Eclipse中获取方法的VM方法签名?
- 13. 从外部Java获取方法.jar文件
- 14. JAR文件:数字签名
- 15. 从Java的Native方法获取方法签名
- 16. 如何从另一个文件中获取方法undefined方法
- 17. 如何从.jnlp文件获取.jar文件?
- 18. 如何从jar文件中获取Manifest.mf文件内容
- 19. 如何签名包含另一个jar文件的jar
- 20. 如何将签名的jar文件转换为.exe文件并保持签名?
- 21. 从main()方法中获取可执行jar名称
- 22. 如何以编程方式从* .dll(*。exe,*。msi)文件获取签名列表?
- 23. 如何从URI获取文件名
- 24. 如何从Response.Header获取文件名? C#
- 25. 如何从路径获取文件名?
- 26. 如何从request.FILES获取文件名?
- 27. 如何从文件名获取日期
- 28. 如何从意图获取文件名?
- 29. 如何从TextView中获取文件名
- 30. 如何从nodejs app.post获取文件名?
喜欢反思? – 2009-06-10 15:37:11