11
votes

Comment les serveurs d'applications injectent-ils dans des champs privés?

J'ai vu cette question

Injectez-vous dans un champ privé, package ou public ou fournir un seigteur?

sur la manière d'injecter manuellement dans les champs privés annotés (la voie à ajouter des ensembles ou à travers un constructeur)

mais, le point est comment faire un serveur d'applications (comme Glassfish, Axis2, JBoss, ...) est capable d'injecter dans un champ privé final (sans ajouter de setters ni de constructeurs à la classe d'utilisateurs)?

citant la question citée: xxx

utilise-t-il une JVM personnalisée (pas la standard) qui permet d'accéder à une entreprise privée champs?

merci


2 commentaires

Ceci est privé, mais pas final. Avez-vous manqué final dans le bloc de code? Parce que je ne pense pas qu'il soit possible d'injecter des membres finaux privés. (Corrige moi si je me trompe.)


@WILLI: Tu as raison. Dans l'échantillon de code ci-dessous, j'ai mis finale, mais même aucune erreur n'a été soulevée par la méthode Doinjection () La valeur n'a pas changé. Donc j'ai retiré final.


3 Réponses :


16
votes

C'est un «truc» de réflexion simple. Il repose sur le Field.SeCessible () Méthode Pour forcer le membre à être accessible par programme:

Définir le drapeau accessible pour cela objet à la valeur booléenne indiquée. Une valeur de vrai indique que le L'objet reflété devrait supprimer Java Vérification de l'accès linguistique quand il est utilisé. Une valeur de faux indique que L'objet réfléchi devrait appliquer Vérifications d'accès linguistique Java.

L'API de réflexion est utilisée pour obtenir une poignée sur le champ, Sétapestible () est appelé, puis il peut être défini par le cadre d'injection.

Voir un exemple ici .

pas de magie, pas de vm personnalisé


0 commentaires

6
votes

Avec l'aide de Skaffman, j'ai codé cet exemple simple sur la façon d'injecter sans setters. Peut-être cela aide-t-il (il m'a fait) xxx

sortie d'exécution: xxx


0 commentaires

3
votes

Il convient également de noter que certains cadres utilisent l'ingénierie de Bytecode via un chargeur de classe personnalisé pour obtenir le même résultat sans le coût de la réflexion (la réflexion peut être assez coûteuse parfois)


0 commentaires