2015-09-16 5 views
0

Je commence à travailler sur un projet et pour l'une des tâches dont j'ai besoin pour analyser le code source afin de recueillir des informations sur les classes et leurs méthodes. Plus spécifiquement, pour chaque méthode, j'ai besoin de connaître les attributs internes et les objets externes (références) qu'il utilise dans tout le corps de la méthode. Je l'ai discuté avec mes superviseurs et ils pensent que les librairies de manipulation Bytecode sont la bonne solution. J'ai déjà regardé BCEL, ASM et Javassist mais je ne suis pas sûr de savoir lequel j'ai besoin d'utiliser. Est-ce qu'ils donnent tous accès au corps de la méthode où je peux voir toutes les instructions et obtenir les informations dont j'ai besoin?Java Bibliothèques de manipulation de Bytecode

Un conseil serait d'apprécier. Je vous remercie!

Répondre

1

Si vous avez vraiment "besoin d'analyser le code source", alors les bibliothèques qui permettent d'inspecter le bytecode ne sont pas la solution.

Sinon, vous devez vraiment définir votre tâche avec précision. Soit vous êtes sur le point d'analyser des classes, que vous regardiez leur code source ou octet, ou que vous souhaitiez analyser le code source et envisager de le faire en compilant d'abord, puis en analysant le résultat compilé. Dans ce dernier cas, vous devez comparer l'effort des deux étapes avec une autre solution, qui peut, par exemple, intégrer l'analyse de code source direct.

Le code d'octet d'analyse est plutôt facile, plus facile que l'analyse du code source, ce qui explique pourquoi le bytecode est produit avant l'exécution des programmes Java. Pour répondre à votre question concrète, oui, les trois bibliothèques vous offrent un moyen d'analyser les instructions et les informations associées. Lequel est le meilleur pour répondre à vos besoins, est une question qui est beyond the scope of Stackoverflow. Si l'analyse du code d'octet aide, dépend de vos besoins exacts. En ce qui concerne l'accès au champ et à la méthode, vous pouvez précisément obtenir la plupart d'entre eux en utilisant cette approche. Seules les constantes de compilation à la ligne n'ont pas leurs origines. Quand il s'agit de l'utilisation de type, vous devez considérer que tous les artefacts de code source n'ont pas une contrepartie existante dans le code octet, par ex. les distributions élargies ne produisent aucun code réel et les variables locales n'ont généralement pas de type déclaré (informations de débogage mises à part), mais seulement un type implicite qui dépend de la façon dont elles sont réellement utilisées. Ils n'ont également aucune information sur les génériques, sauf si des informations de débogage ont été incluses.

+0

Merci pour la réponse! J'ai décidé d'aller analyser le bytecode car comme tu l'as dit, c'est beaucoup plus facile que d'avoir à analyser le code source. Pour l'instant, ma tâche est simplement ce que j'ai déclaré, vérifier toutes les méthodes d'une classe spécifique et retourner une liste de variables utilisées dans cette méthode. Je vais regarder de plus près trois options. Merci encore. – Rizkallah