2017-06-30 1 views
0

J'ai un ServiceReference et je veux vérifier si l'implémentation a une annotation. J'ai donc besoin de la classe d'implémentation.Obtenir l'implémentation de ServiceReference

Je compris comment obtenir les interfaces des services met en œuvre:

ServiceReference<T> reference = // 
String[] interfaces = (String[]) reference.getProperty(org.osgi.framework.Constants.OBJECTCLASS); 

Mais même avec le JavaDoc je ne peux pas comprendre comment obtenir la mise en œuvre (évidemment sans obtenir le service du contexte, parce que cela pourrait être une opération lourde et j'ai juste besoin de la classe).

Comment puis-je obtenir la mise en œuvre d'un ServiceReference?

Répondre

1

Vous voulez donc obtenir l'objet de service sans obtenir l'objet de service? Je pense que vous demandez quelque chose d'impossible. Vous devrez obtenir l'objet de service pour introspecter sa classe d'implémentation pour les annotations. Il n'y a pas d'autre moyen. Assurez-vous de désengager l'objet de service lorsque vous avez terminé.

+0

Gardez à l'esprit que même le registre des services OSGi ne connaît pas la classe d'implémentation de l'objet de service tant que le service n'a pas été récupéré dans le registre. En effet, le fournisseur peut instancier l'objet de service très tard en enregistrant un ServiceFactory. –

0

Vous devez obtenir le service en utilisant service = context.getService(reference). Ce n'est pas une opération de poids lourd.

Vous pourriez également bénéficier d'un ServiceTracker. En dehors de cela, je suis curieux de savoir ce que vous voulez réaliser ... peut-être qu'il y a un meilleur moyen.

+0

Cela ne devrait pas être une opération lourde, mais nous essayons de créer un petit conteneur qui injecte un 'EntityManager' dans nos services, donc je ne suis pas sûr que cela soit vrai la semaine prochaine. C'est pourquoi j'aimerais ne pas interférer avec le chargement paresseux du contexte OSGi juste parce que je veux voir si le service a une annotation en le marquant comme "s'il vous plaît injecter en moi". –

+0

Il existe déjà des solutions pour injecter un EntityManager. Voir Apache aries jpa examples https://github.com/apache/aries-jpa/tree/master/examples –

+0

Jep, nous avons beaucoup essayé Aries et Gemini, et les deux ne fonctionnent pas avec Hibernate. Puisque nous n'avons vraiment besoin que du 'EntityManager', nous avons décidé de le faire nous-mêmes. –