3 votes

Comment déterminer les méthodes utilisées par une classe Java ?

Je dois fournir un rapport sur les API utilisées par notre code, et sur les méthodes exactes qui sont appelées. Pour une DLL Windows, j'utiliserais "dumpbin /imports". Existe-t-il un équivalent pour un fichier .class Java ?

javap semble être l'endroit évident à regarder, mais je ne trouve aucune option qui semble faire ce que je cherche.

2voto

aponomarenko Points 6966

javap -c class1 class2 ... | grep invoke

Vous obtiendrez tous les appels d'exécution. Vous devez les filtrer de vos API et vous obtiendrez les appels aux méthodes importées.

Vous pourriez également vouloir déterminer les champs importés utilisés :

javap -c class1 class2 ... | grep getstatic (chercher aussi putstatic, putfield, getfield)

1voto

jowierun Points 4127

C'est brutal, mais vous pourriez essayer quelque chose comme ça :

  1. faites une recherche/remplacement globale dans votre code pour "import x.y.Z" avec la classe statique Z{} où le paquet x.y provient de votre tierce partie

  2. jar lancer votre compilation script (ou copier les erreurs de votre IDE si possible)

  3. traiter les erreurs de compilation en recherchant " The method xxx is undefined "type de messages

0voto

bmargulies Points 49855

Qu'en est-il d'Apache/Maven ? jxr ?

0voto

Larry Watanabe Points 7305

Je ne connais pas d'outil spécifique pour faire cela, mais il me semble que cela pourrait être fait avec une difficulté modérée en utilisant un perl script, si vous avez le jar ou la source.

Vous pouvez exécuter le jar par le biais de jad http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler) pour générer le source, puis écrire un perl script qui :

  1. Analyse chaque fichier de votre source

    a. trouve toutes les chaînes d'expression reg d'importation

    b trouve tous les fichiers sources dans la source tierce décompilée qui correspond à l'importé paquet

    c. pour chaque fichier de la tierce partie, extraire les noms de méthodes

    d. s'il y a correspondance, enregistrez la méthode + la classe + le paquet.

Il est bien sûr possible d'améliorer l'efficacité de ce processus : vous pourriez créer une table de hachage de tous les paquets et, à l'intérieur de celle-ci, une table de hachage de toutes les méthodes pour la tierce partie.

Une fois qu'une méthode est utilisée, vous pouvez la supprimer du tableau, car vous n'avez pas besoin de la rechercher à nouveau.

Mais la méthode de la force brute est probablement suffisante, car il ne s'agit pas d'un problème à forte intensité de calcul (même si, bien sûr, pour un humain, ce serait un travail très intensif !)

Remplacez perl par ruby/python/php/sed/awk si vous préférez.

0voto

mikera Points 63056

Si vous voulez beaucoup de puissance et de flexibilité, je vous conseille de jeter un coup d'œil au Bibliothèque ASM

Il existe en fait un grand nombre de bons outils pour analyser et manipuler le bytecode java. L'un des plus utiles est une API basée sur vistor qui peut parcourir l'intérieur de n'importe quelle classe et effectuer l'analyse que vous souhaitez (dans votre cas, détecter les autres classes / paquets référencés).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X