10
votes

Java - créer une sous-classe de manière dynamique

J'aimerais créer une sous-classe par programme. Je suppose que j'ai peu d'options - Javassist, CGLIB, BCEL ou ASM.

Le cas d'utilisation est que les internes d'une application sont axées sur la classe et les extensions sont basées sur la classe. Par conséquent, je ne peux pas avoir une seule classe comme base pour plusieurs extensions entraînées par des scripts extérieurs.

Maintenant - comment je ferais cela? J'ai trouvé des exemples avec des appels de méthode interceptés, un accès sur le terrain, une initialisation, etc. mais rien sur le sous-classement.

J'aimerais retrouver avec une classe qui:

  • a un nom que je veux.
  • est une sous-classe (directe, au mieux) d'une classe donnée
  • copie le (s) constructeur (s) de la classe mère (ou des appels super (...) )
  • Finalement, je voudrais lui donner des annotations.

    Je sais que c'est possible car diverses intégrations de langues dynamiques, telles que groovyclassloader , peuvent faire cela.


0 commentaires

3 Réponses :


7
votes

C'est assez facile avec Javassist: xxx

dépendance maven: xxx


0 commentaires

3
votes

Les proxy Java peuvent être capables de faire ce dont vous avez besoin - ils vous permettent essentiellement de caler de manière dynamique la fonctionnalité sur un objet, car vous pouvez intercepter les appels de méthode à cet objet et les gérer vous-même ou envoiez les appels de méthode vers la classe sous-jacente. Selon ce que vous cherchez à faire, il se peut que vous puissiez obtenir le même résultat que vous le feriez en créant une sous-classe de manière dynamique

oracle a un Introduction décente sur Leur site Web (l'URL références Java version 1.4.2, mais je ne pense pas que le comportement de cela a changé dans des versions plus récentes). Voici un exemple plus concis qui donne un bonne saveur pour quel code proxy ressemble à.

Il est également possible de faire des choses à l'aide de la manipulation de code d'octete directe (tel que supporté par le ASM Framework ) J'imagine que l'utilisation de proxies serait une approche plus simple.


1 commentaires

En fait, j'ai examiné d'abord les mandataires mais laissé cela en raison de la complexité. Javassist est si plus facile. Et aussi, les mandataires ont besoin d'une interface et ne peuvent plus être envahi comme des classes normales ... Quoi qu'il en soit, +1



7
votes

Une bibliothèque que j'aime particulièrement peut être utilisée ici; bytebuddy .

Exemple pris directement à partir de la page d'atterrissage: < Pré> xxx

C'est incroyablement flexible et qui vaut vraiment la peine d'être vérifié si vous souhaitez garder vos cheveux, je personnellement trouver une utilisation lourde du javassiste peut parfois devenir très moche et désordonnée parfois , Bytebuddy se sent comme une bouffée d'air frais et bien nécessaire!

Rafael Winterhalter < / a> est également actif sur Stackoverflow qui facilite la découverte de tout ce que vous n'êtes pas sûr d'une brise.

Edit: Mes excuses pour le nécroposting. Atterri ici quand un ami a lié la question et a oublié de vérifier la date.


1 commentaires

Le lien BYTEBUDDY semble lier à cette même page