Java: L'Extension De La Classe Au Moment De L'Exécution
J'ai la possibilité d'étendre une classe au moment de la compilation, mais j'ai besoin d'être en mesure de créer une instance de cette sous-classe lors de l'exécution à l'aide d'une instance de la super-classe qui était déjà instancié.
Cela devrait être possible en théorie, car superclasse les constructeurs sont déjà appelé avant que le constructeur de sous-classe.
Je n'ai pas accès au programme suffisamment pour modifier l'instanciation de mon sous-classe ni d'interrompre l'origine de l'instanciation.
Cas d'utilisation: Il existe un tableau d'instances de la classe X. Mon code est chargé de après. J'ai besoin de remplacer l'une des méthodes de l'une des instances de X avec mon chargé de la sous-classe Y étend X. Le programme parent accède aux objets que grâce à ce tableau, je veux donc remplacer cet élément de tableau avec mon Y instance, mais il doit se comporter comme si elle était instancié à l'origine dans ce tableau. Je ne peux pas joindre la super-classe de l'instance et le renvoi des appels, et il est difficile de complications avec reinstantiating la super-classe.
J'espère que c'est plus clair.
Pouvez-vous fournir un exemple de ce que vous êtes en train d'essayer d'accomplir? Au lieu de simplement de votre choix, mais peut-être impossible, façon de le faire.
Supposons ligne existante "public static Foo foo = new Foo();" que je ne peux pas modifier. J'ai "public class Barre s'étend Foo" et je veux faire "foo = Bar (...)", tel que c'était comme si la première ligne est "public static Foo foo = Bar()".
Pour ceux qui cherchent à étendre une classe au moment de l'exécution, et de ne pas changer le moteur d'exécution type d'objets existants, voir Extension de la classe lors de l'exécution
OriginalL'auteur JAKJ | 2012-04-06
Vous devez vous connecter pour publier un commentaire.
Réitérer ce que vous essayez de faire..
Au sein de la JVM, il existe une instance de ClassA. Vous souhaitez modifier dynamiquement la classe heiarchy de ClassA, de sorte qu'une nouvelle classe est appelée ClassB, qui résulte de l'ClassA. Ensuite, vous souhaitez instancier une instance de ClassB mais il est sous-classe de mise en œuvre que de l'instance existante de ClassA. Quelque chose comme une mémoire de remplacement.
Vous voudrez peut-être regarder dans http://www.jboss.org/javassist . Ce que vous devez faire est de remplacer le chargeur de classe, puis de déterminer quand ClassA est en cours de chargement, ensuite instancié. Vous auriez alors besoin de construire ClassB et retour à la place.
Mise à jour
Après un peu plus de recherche, il ya toujours la possibilité que vous pouvez faire ce que vous voulez. L'IDE comme Eclipse soutien HotSwap avec les implémentations de méthode en cours de débogage. Ils utilisent l'Instrumentation de l'API.
http://zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/
Vous pouvez remplacer le corps de méthode, mais de ne pas ajouter ou supprimer des méthodes elles-mêmes. Ainsi, alors que vous ne serez pas en mesure de changer le type de votre nouveau type, vous pouvez tout à fait remplacer la méthode de la mise en œuvre avec votre nouvelle mise en œuvre.
La réponse est toujours la même. Vous avez un objet que vous souhaitez pour s'Adapter à un autre type d'objet. SI vous pouvez contrôler la première au point de retour de ce nouvel objet, alors vous pouvez l'Adapter et de le retourner l'instance que vous souhaitez. Je vous suggère de mettre à jour votre question avec votre Cas d'Utilisation, pas ce que vous pensez que la solution est.
Je n'ai pas la possibilité de remplacer le chargeur de classe que ma classe est chargé après la super-classe, ni puis-je utiliser des tiers runtimes. Ce doit être à l'intérieur de Java.
Vous êtes SOL puis. Si vous pouvez contrôler la façon dont la JVM commence, vous ne pouvez rien faire. Si vous ne pouvez pas, alors vous êtes coincé. Qu'est-ce que le Cas d'Utilisation? Veuillez mettre à jour la question d'origine avec ce que vous avez besoin pour accomplir.
J'ai mis à jour l'OP avec un effort de clarification.
OriginalL'auteur Andrew T Finnell
Je conseille cglib:
Vous pouvez trouver des exemples ici:
https://github.com/cglib/cglib/wiki
OriginalL'auteur Lefteris Laskaridis
Je ne sais pas si c'est une solution, mais si vous avez
et vous voulez la remplacer avec la Barre qui s'étend Foo
prendre la Barre d'un Wrapper pour de Foo et utiliser la réflexion pour laisser foo point à votre Barre d'instance.
et
}
Comme l'a dit je ne sais pas si c'est possible dans votre cas.
OriginalL'auteur andih
Avez-vous regardé les Proxies Java?
Ici est un extrait de Javadoc:
"Une dynamique de la classe proxy (appelée simplement une classe proxy ci-dessous) est une classe qui implémente une liste des interfaces spécifiées au moment de l'exécution, lorsque la classe est créée"
OriginalL'auteur Alex Paransky