Comment intercepter une invocation de méthode avec des fonctionnalités java standard (sans AspectJ etc)?
Je veux intercepter tous les appels de méthode à une classe Maclasse pour être en mesure de réagir sur certains setter-invocations.
J'ai essayé d'utiliser des proxies dynamiques, mais autant que je sache, cela ne fonctionne que pour les classes implémentant l'interface. Mais MyClass ne dispose pas d'une telle interface.
Est-il un autre moyen, en plus de l'implémentation d'une classe wrapper, que les délégués de toutes les invocations d'un membre, ce qui est une instance de Maclasse ou d'ailleurs à l'aide de l'AOP?
source d'informationauteur Tobias Hilka
Vous devez vous connecter pour publier un commentaire.
Comme vous le notez, vous ne pouvez pas utiliser le JDK proxies dynamiques (pas d'interface), mais en utilisant Printemps et CGLIB (POT inclus avec le Printemps), vous pouvez effectuer les opérations suivantes:
Si vous êtes prêt à faire quelque chose de vraiment moche, avoir un regard sur:
http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/
Fondamentalement le débogueur interface devrait vous permettre d'attacher comme un débogueur, et donc d'intercepter les appels. Gardez à l'esprit, je pense que c'est une vraiment mauvaise idée, mais tu m'as demandé si c'était possible.
Java n'ont pas de réelles fonctionnalités de langage pour la méthode d'interception (pas sûr de l'électricité statique de la langue ne)
J'ai un peu comme Nick l'idée d'utiliser le débogueur de l'interface, c'est juste moyenne.
Je pense que la réponse que vous avez besoin est: Non il n'y a pas un moyen d'intercepter un appel de méthode en Java sans remplacement de la classe en utilisant un proxy ou wrapper.
Remarque: L'AOP bibliothèques venons de faire ceci se produire automatiquement.
J'ai juste mis au point un petit cadre à cet effet.
Vous pouvez le vérifier sur: http://code.google.com/p/java-interceptor/ (utilisation de svn pour vérifier).
Certains de Java gourous peuvent froncer les sourcils sur, mais j'ai eu un bon succès avec en évitant les types primitifs et les setters tout à fait. Ma classe ressemble à ceci:
Vous remarquerez deux choses: 1. tout est public. 2. Aucun constructeur.
La magie qui se passe dans SmartPojo, qui cherche n'importe quel domaine qui met en place la "Puce" de l'interface et l'initialise. Car ce n'est pas une primitive (et pas de finale de la classe), je peux ajouter set() et get() méthodes pour tous les champs de n'importe où dans mon modèle en un seul endroit. Donc pas de setter/getter déchets de plus, il est incroyablement simple à ajouter une notification (également en un seul endroit), etc.
Vrai, ce n'est pas POJO plus et ce n'est pas un Haricot dans la plupart des cas, mais j'ai trouvé que ces idées anciennes limite de moi, plus qu'ils n'aident. YMMV.
Il n'y a pas beaucoup de magie dans AspectJ. Vous pouvez écrire votre propre agent. http://java.sun.com/javase/6/docs/api/java/lang/instrument/package-summary.html semble être un bon point de départ.
Pourquoi ne pas votre classe implémente une interface? Vous pouvez simplement extraire une partie de l'interface à partir de ce contenant toutes les méthodes que vous souhaitez intercepter et utiliser les proxies dynamiques mécanisme facilement. C'est aussi une bonne pratique de programmation de code avec des interfaces et non des classes.
Vous pouvez utiliser le framework Spring Spring AOP capacités (qui sont en utilisant des proxies dynamiques à l'intérieur) pour le faire. Vous n'avez qu'à définir votre classe comme un Printemps bean dans le fichier de configuration et les clients de votre classe devra obtenir son instance dans le Ressort contexte de l'application ou de dépendance automatiquement (par définition de la setMyClass(MyClass mc) méthode par exemple). De là, vous pouvez facilement aller à la définition d'un aspect qui intercepte tous les appels de méthode de cette classe.
Pour l'interception de la méthode java invoketion un AspectJ est un bon outil à utiliser. À travers ce qui peut intercepter mthod appels, les exécutions, etc.. de manière efficace. Je suis usin le même outil pour l'interception java appels de méthode.
Nous pouvons appliquer pointcuts ansd aspects d'Intercepter tout java appels de méthode.
pour simple information, lisez cette