2009-06-10 10 views
38

Tengo un archivo jar de terceros que viene con los javadocs para sólo una parte de la API. ¿Hay alguna manera de realizar una ingeniería inversa del archivo jar para obtener una lista completa de clases y métodos?¿Cómo obtener las firmas de métodos de un archivo jar?

+2

Al igual que con la reflexión? –

Respuesta

43

jar tf enumerará los contenidos para usted. javap le permitirá ver más detalles de las clases (consulte la guía de herramientas).

Por ejemplo, si usted tiene una clase llamada mypkg.HelloWorld en un frasco myjar.jar luego ejecutarlo como

javap -classpath myjar.jar mypkg.HelloWorld 

Sin embargo, está seguro de que quiere ser el uso de estas API no publicados? Por lo general, es una muy mala idea.

3

Si está utilizando eclipse, puede simplemente agregarlo a la ruta de clase de un proyecto y explorarlo utilizando la vista de árbol y/o la asistencia de contenido.

Me asumir otros IDE pueden hacer similares.

Desde un punto de vista de línea de comandos, puede desvincularlo (jar xf foo.jar) y usar javap contra todos los archivos.

5

Como dijo Scott, puedes usar Eclipse para obtener mucho de lo que estás buscando.

Recomendaría obtener el JadClipse plugin que descompilará los archivos .class sobre la marcha y le mostrará el código real de Java mientras navega por las clases en el IDE.

+0

De acuerdo. Una combinación muy poderosa –

1
  • Eclipse sería un gran trabajo

  • Un Java Decompiler se traduciría las clases de nuevo en algunos semblence de código fuente que se puede estudiar para aprender acerca de las clases, los métodos, sus firmas, y tal vez incluso una cierta penetración en valores válidos para algunos argumentos (por ejemplo, no deje pasar un nulo para este argumento o te activa una NullPointerException inmediatamente). Pero enrolle sus mangas para deshacer el tarro y ejecutar el descompilador contra todos los archivos de clase. Esto es esencialmente lo que Eclipse está haciendo para obtener texto de ayuda con clases no documentadas.

  • Finalmente, por supuesto, un "real programmer" leería el byte-code directamente sin necesidad de descompilador.

2

una ayuda rápida para conocer los métodos de una clase normal (clase no abstracta), hago lo siguiente.

new classname(). Presione ctrl + espacio para la lista de métodos en eclipse.

0

Utilice Eclipse> Package Explorer para ver las clases y su jerarquía.

ayuda de contenido (función de autocompletar (Ctrl + espacio)) es también una buena ayuda, pero no me recomendar el uso de una API no publicada

3

Puede utilizar la biblioteca WALA dar lectura a todas las firmas de métodos. Sin embargo, primero deberá cargar Stub-Code for Java. El siguiente programa debe leer todas las firmas:

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()); 
       } 
      } 
     } 
    } 
} 

Si utiliza la versión WALA-adaptado de here lo hace Dalvik (por ejemplo,Aplicaciones de Android) también.

Cuestiones relacionadas