Comment puis-je imprimer les structures de classe dans un fichier jar en utilisant l'outil de javap?
-
19-09-2019 - |
Question
Je veux énumérer les méthodes des fichiers de classe dans le pot en utilisant l'outil de javap. Comment puis-je faire pour qu'il énumère les méthodes et les membres de tous les fichiers de classe dans le pot. En ce moment, je suis en mesure de le faire pour une seule classe à la fois.
Je me attends quelque chose comme si je dis
javap java.lang.*
il doit recourir aux méthodes et aux membres de toutes les classes de package java.lang. Si javap n'est pas capable de cela, y at-il de tels outils disponibles?
La solution
#!/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
Autres conseils
Encore plus facile serait
JAR=<path to jarfile> \
javap -classpath $JAR $(jar -tf $JAR | grep "class$" | sed s/\.class$//)
Tout d'abord décompressez le fichier jar, cela donne une série de répertoires pour chaque paquet, puis appliquez la commande javap par répertoire.
Ainsi, par exemple avec tomcat, vous pouvez décompresser le fichier catalina-balancer.jar dans webapps \ équilibreur puis utilisez
javap -classpath org\apache\webapp\balancer Rule
qui donne
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 vous avez besoin de faire cela pour tous les fichiers de classe dans un package, vous devrez écrire un script ou un programme pour marcher sur le chemin de classe et dépouiller les .class des noms de fichiers et le transmettre à javap.
(Il serait assez facile d'écrire en Perl / bash / java).