2009-07-23 4 views
14

Quiero enumerar los métodos de los archivos de clase en el contenedor utilizando la herramienta javap. ¿Cómo lo hago para que enumere los métodos y los miembros de todos los archivos de clase en el contenedor? Ahora mismo puedo hacerlo solo por una clase a la vez.¿Cómo imprimo las estructuras de clase en un archivo jar utilizando la herramienta javap?

estoy esperando algo así como si digo

javap java.lang.* 

debe contar con los métodos y los miembros de todas las clases en el paquete java.lang. Si javap no es capaz de eso, ¿hay alguna de esas herramientas disponibles?

Respuesta

22
#!/bin/bash 
# Set the JAR name 
jar=<JAR NAME> 
# Loop through the classes (everything ending in .class) 
for class in $(jar -tf $jar | grep '.class'); do 
    # Replace /'s with .'s 
    class=${class//\//.}; 
    # javap 
    javap -classpath $jar ${class//.class/}; 
done 
+6

javap gustará los nombres de clases descartables con '/' en lugar de '.', solo necesita eliminar el sufijo' .class'. Estoy usando 'zipinfo -1 $ {jar} \ *. Clase | sed 's/\. clase //' | xargs javap -classpath "$ jar" -c -l -private> $ {jar} .javap' –

2

Primero descomprima el archivo jar, esto producirá una serie de directorios para cada paquete, luego aplique el comando javap por directorio.

Así, por ejemplo, con Tomcat se puede descomprimir el archivo catalina-balancer.jar en webapps \ equilibrador y luego usar

javap -classpath org\apache\webapp\balancer Rule

que da

Compiled from "Rule.java" 
interface org.apache.webapp.balancer.Rule{ 
    public abstract boolean matches(javax.servlet.http.HttpServletRequest); 
    public abstract java.lang.String getRedirectUrl(); 
}

Si necesita hacer esto para todos los archivos de clase en un paquete necesitarán escribir un script o programa para recorrer el classpath y quitar .class de los nombres de archivo y pasarlo a javap.

(Sería bastante fácil escribir en perl/bash/java).

+0

Claro - Me gusta tener cosas extra por ahí mi sistema. Esto funciona pero no es bonito. – javadba

9

Incluso más fácil sería

javap -classpath <JARNAME> $(jar -tf <JARNAME> | grep "class$" | sed s/\.class$//) 
+2

anteponer JARNAME =/ruta/a/jar y eso mantiene toda la operación en una sola línea – javadba

Cuestiones relacionadas