Подтвердить что ты не робот

Как получить сигнатуры методов из файла jar?

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

4b9b3361

Ответ 1

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

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

javap -classpath myjar.jar mypkg.HelloWorld

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Вы можете использовать библиотеку 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).

Ответ 5

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

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

Ответ 6

  • Eclipse будет работать отлично

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

  • Наконец, конечно, "real programmer" прочитал бы байтовый код непосредственно без необходимости декомпилятора.

Ответ 7

Используйте Eclipse > Package Explorer для просмотра классов и иерархии.

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