У меня есть сторонний файл jar, который поставляется с javadocs только для части API. Есть ли способ перепроектировать файл jar, чтобы получить полный список классов и методов?
Как получить сигнатуры методов из файла jar?
Ответ 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