Как получить сигнатуры методов из файла JAR? - PullRequest
44 голосов
/ 10 июня 2009

У меня есть сторонний jar-файл, который поставляется с javadocs только для части API. Есть ли способ перепроектировать файл JAR для получения полного списка классов и методов?

Ответы [ 7 ]

55 голосов
/ 10 июня 2009

jar tf покажет содержимое для вас. javap позволит вам увидеть более подробную информацию о классах (см. Руководство по инструментам).

Например, если у вас есть класс с именем mypkg.HelloWorld в банке myjar.jar, запустите его как

javap -classpath myjar.jar mypkg.HelloWorld

Однако вы уверены, что хотите использовать эти неопубликованные API? Обычно это действительно плохая идея.

5 голосов
/ 10 июня 2009

Как сказал Скотт, вы можете использовать Eclipse, чтобы получить много того, что вы ищете.

Я бы порекомендовал получить плагин JadClipse , который декомпилирует файлы .class на лету и покажет вам фактический код Java при просмотре классов в IDE.

4 голосов
/ 16 августа 2013

Вы можете использовать библиотеку WALA для считывания всех сигнатур методов. Однако вам сначала нужно будет загрузить Stub-Code для 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 Apps).

4 голосов
/ 10 июня 2009

Если вы используете eclipse, вы можете просто добавить его в путь к классам проекта и исследовать его, используя древовидную структуру и / или вспомогательный контент.

Я бы предположил, что другие IDE могут делать то же самое.

С точки зрения командной строки вы можете разархивировать его (jar xf foo.jar) и использовать javap для всех файлов.

2 голосов
/ 06 декабря 2011

быстрая помощь для знания методов нормального класса (не абстрактного класса), я делаю следующее.

новое имя класса (). Нажмите ctrl + пробел для перечисления методов в eclipse.

2 голосов
/ 10 июня 2009
  • Eclipse будет отлично работать

  • A Java Decompiler переведет классы обратно в некоторый набор исходного кода, который вы могли бы изучить, чтобы узнать о классах, методах, их сигнатурах и, возможно, даже получить представление о допустимых значениях для некоторых аргументов (например, не передавайте null для этого аргумента, или вы сразу же вызовете исключение NullPointerException). Но закатайте рукава, чтобы расстегнуть банку и запустить декомпилятор для всех файлов классов. По сути, это то, что Eclipse делает для текста справки с недокументированными классами.

  • Наконец, конечно, «настоящий программист» будет читать байт-код напрямую, без необходимости декомпиляции.

0 голосов
/ 01 апреля 2012

Используйте Eclipse> Package Explorer, чтобы увидеть классы и их иерархию.

Content Assist (функция автозаполнения (ctrl + пробел)) также является хорошей помощью, но не рекомендуется использовать неопубликованный API

...