Question

un collègue m'a indiqué l'autre jour BCEL qui, autant que je sache d'après son explication et une lecture rapide, un moyen de modifier au moment de l'exécution le code d'octet.Ma première pensée était que ça avait l’air dangereux, et ma deuxième pensée était que ça avait l’air cool.Ensuite, j'y ai réfléchi davantage et je me suis rappelé du post de codinghorror sur le patch de singe et j'ai réalisé que c'était fondamentalement la même chose.Quelqu'un a-t-il déjà utilisé BCEL à des fins pratiques ?Ai-je raison de dire qu'il s'agit essentiellement d'un correctif de singe au moment de l'exécution, ou est-ce que j'ai raté quelque chose ?

Était-ce utile?

La solution

C'est un peu plus bas niveau que le correctif singe classique, et d'après ce que j'ai lu, les classes déjà chargées dans la VM ne sont pas mises à jour.Il prend uniquement en charge l'enregistrement à nouveau dans les fichiers de classe, sans modifier les classes d'exécution.

Autres conseils

Extrait de la FAQ du BCEL :

Question :Puis-je créer ou modifier les classes dynamiquement avec BCEL?

UN:BCEL contient des classes utiles dans le package Util, à savoir Classloader et Javawrapper.Pake un aperçu de l'exemple de proxycréateur.

Mais le patching de singes est...euh...controversé, et vous ne devriez probablement pas l'utiliser si votre langue ne le prend pas en charge.

Si vous avez un bon cas d'utilisation, puis-je suggérer d'intégrer Jython ?

Vous pourriez le considérer comme un patch de singe.Je préfère ne pas l'utiliser (peut-être n'ai-je jamais rencontré de bon cas d'utilisation ?), mais me familiariser avec lui (pour avoir une idée de comment Spring et Hibenrate l'utilisent et pourquoi).

Voir cet exemple réel : Jawk - Module compilateur.BCEL est utile pour "compiler" votre langage personnalisé.

BCEL ne prend pas en charge les correctifs singe, il manipule simplement le bytecode et le charge éventuellement dans un chargeur de classe personnalisé.Cependant vous peut implémenter Monkeypatching sur JVM en utilisant une bibliothèque comme BCEL et un agent Java.L'agent Java (chargé par l'argument -javaagent) peut accéder à l'API Instrumentation et modifier les classes chargées.Il n'est pas difficile de le mettre en œuvre via certains ponts.

Mais rappelles-toi:

  • Je ne sais pas si vous souhaitez utiliser -javaagent.
  • Dans n'importe quelle langue, le patching des singes peut conduire à un comportement peu prévisible.
  • Vous pouvez modifier une méthode.En théorie, vous pouvez également ajouter une méthode, mais vous devez compiler le projet avec des classes modifiées (corrigées).Je pense que cela causerait beaucoup de douleur et que cela n’en vaut pas la peine.Il existe des langages alternatifs qui le prennent en charge (par ex.Groovy) ou prendre en charge quelque chose de similaire (par ex.conversions implicites dans Scala).
  • Il est préférable de bien concevoir votre API plutôt que d'utiliser des correctifs singe.Cela peut être plutôt utile pour les bibliothèques tierces.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top