Y a-t-il un moyen que nous puissions injecter de nouvelles méthodes et propriétés dans des classes pendant le temps d'exécution. P>
http: //nurkiewicz.blogspot. Com / 2009/09 / Injection-Méthodes - At-Runtime-to-Java.html États Nous pouvons le faire en utilisant Groovy. p>
est-il possible d'utiliser Java? P>
5 Réponses :
est-il possible d'utiliser juste en utilisant Java? P> blockQuote>
La réponse simple est une question emphatique "Vous ne voulez pas faire ça!". p>
Il est techniquement possible, mais pas sans recourir à des tours extrêmement complexes, coûteux et fragiles tels que la modification du bypode 1 sup>. Et même alors, vous devez compter sur un chargement dynamique pour accéder au type modifié et (probablement) la réflexion pour utiliser ses nouveaux membres. En bref, vous créeriez beaucoup de douleur pour vous-même, pour peu de gain. P>
Java est une langue statistique dactylographiée et ajoute / modifier des signatures de type classe peut casser le contrat de frappe statique d'une classe. P>
1 - aspectj et similaires vous permettent d'injecter un comportement supplémentaire dans une classe, mais ce n'est probablement pas l'injection "Runtime" que vous êtes après. Certes, les méthodes injectées ne seront pas disponibles pour que le code statique compilé soit appelé. Sup> p>
Donc, si vous étiez vraiment fou, vous pouvez faire quelque chose comme ce qu'ils contourent ici < / a>. Ce que vous pourriez faire est de charger le fichier .java, trouvez le point d'insertion correct, ajoutez les méthodes dont vous avez besoin, appelez le compilateur Java et rechargez la classe. Bonne chance débogage de ce désordre :) p>
Modifier strud>
est-il possible d'utiliser Java? P> blockQuote>
Tout à fait, la "seule" chose que vous avez à faire est de définir un Agent d'instrumentation qui fournit un
ClassFileTransformer Code>, et vous devrez utiliser la réflexion pour invoquer les méthodes ajoutées. Les chances sont cependant ce que vous voulez faire, mais c'est faisable et il y a une interface bien définie pour cela. Si vous souhaitez modifier les méthodes existantes, vous pouvez vous intéresser à quelque chose comme AspectJ . P>
Bien que cela puisse être possible, ce n'est pas utile. P>
Comment accéderiez-vous à ces nouveaux champs et méthodes? em> p>
Vous ne pouvez pas utiliser directement ces méthodes et champs directement (comme des champs et des méthodes «ordinaires»), car ils ne seraient pas compilés. P>
Si tout ce que vous voulez, c'est la possibilité d'ajouter des "propriétés" et des "méthodes", vous pouvez utiliser une carte Si vous avez besoin d'une langue d'extension pour Java, une langue dynamique intégrée (telle que JavaScript ou Groovy) peut être ajoutée; La plupart d'entre eux peuvent accéder aux objets et méthodes de Java arbitraires. P>
Vous pouvez faire des choses assez funky avec un AOP, bien que la véritable modification des classes au moment de l'exécution est une jolie technique velue qui nécessite beaucoup de magie de classement et de voyage de la main. P>
Ce qui est plus facile consiste à utiliser les techniques de l'AOP pour générer une sous-classe de votre classe cible et à introduire de nouvelles méthodes à cela, qu'OOP appelé un "mixin" ou "introduction". Voir ici à lire Comment le ressort a-t-il, bien que cela puisse être assez boiteux par rapport à ce que vous essayez réellement de réaliser. P>