No se puede obtener mecanografiado Instancia de la clase de paquete OSGi

Shang Tsung:

Tengo el siguiente situation.I necesita una instancia de la clase A en mi solicitud, y esta clase A proviene de paquete B (OSGi) y se encuentra en el paquete X en ese paquete. Lo que he hecho hasta ahora: He añadido el paquete B al repositorio Maven local y añadido a mi pom como la dependencia de alcance 'siempre'. También he añadido el paquete de X Paquete B, donde la clase A está residiendo a mi pom con Dynamic-importación en mi pom.xml. Hay que destacar aquí - el paquete X no se exporta de Paquete B, pero sé que puede todavía trabajo, he visto compañeros lo hacen, pero no soy tan bueno todavía.

De todos modos la forma en que estoy tratando de conseguir instancia de la clase a continuación:

Bundle bundle;
Class<?> checkClass=bundle.loadClass("full path to class A");

TypeOfClassA newClass=checkClass.newInstance();

y aquí estoy consiguiendo:

java.lang.ClassNotFoundException ClassA not found by myapplication
at 

org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation (BundleWiringImpl.java:1532) a

org.apache.felix.framework.BundleWiringImpl.access $ 400 (BundleWiringImpl.java:75)

Pero por qué ? He cargado el frasco, estoy usando el cargador de clases paquete, también si yo echo checkClass a objetos, puedo ver los métodos y campos de la Clase A, por lo que se ve bien, ¿Cómo puedo obtener una instancia de la clase A?

Christian Schneider:

En OSGi hay una diferencia entre el tiempo de compilación y tiempo de ejecución. En tiempo de compilación que vea las clases de su propio frasco y todas las dependencias de Maven.

En tiempo de ejecución de un paquete por defecto sólo ve sus propias clases. Otros paquetes necesitan una declaración de importación-paquete en el manifiesto. Normalmente esto se crea automáticamente por BND cuando se utiliza una clase. Siempre que sea posible se debe confiar en que el automatismo.

Su caso es diferente, por supuesto, ya que el paquete que desea acceder no se exporta por B. paquete En este caso no hay forma de llegar a la clase A a través del cargador de clases paquete de su propio paquete.

En su lugar tiene que utilizar el cargador de clase B. paquete de paquete Puede obtener paquete B, por ejemplo, desde el BundleContext. A continuación, puede cargar la clase.

Otra opción es que utilice una clase C exportado de Paquete B y utilizar el cargador de clase de la clase C a clase de carga A.

En cualquier caso se trata de un truco. Debe evitar utilizar las clases privadas de otro paquete.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=315480&siteId=1
Recomendado
Clasificación