Pregunta

Parece que todo el mundo ha tenido un cepillo desagradable con el rel Servicio de Java Proveedor , esa cosa que puede hacer con un archivo denominado como META-INF / services / com.example.Interface, pero que nadie los usos excepto para intentar cargar el analizador XML correcto. Estoy tratando de trabajar con una biblioteca que utiliza la API de proveedor de servicios, y engañar para que yo puedo ofrecer algunas clases de ejecución extendido (utilizando cglib) que en realidad no implementan la interfaz, pero se pueden hacer para hacerlo fácilmente.

Básicamente, creo que los pasos que necesito para llevar a cabo son:

  1. Crea un cargador de clase personalizada que responda a getResources (...) y devolver una dirección URL
  2. "extra"
  3. También tiene que getResourceAsStream gancho cargador de clases (...) para devolver una lista de las clases que voy a manipular con cglib, cuando se le preguntó por el recurso "extra"
  4. Por último, tiene que carga el cargador de clases esas clases cuando se le solicite

Pero aquí es donde me pierdo. Por ejemplo, cuando los intentos de la biblioteca para determinar qué ejecutores están ahí fuera, llama getResources (...) que devuelve un montón de direcciones URL. Pero getResourceAsStream (...) no toma las direcciones URL, se necesita "nombres". Nombres que parecen ser ruta de clases de relación, y por lo tanto la misma en todas partes. Así META-INF / services / com.example.Interface en cuenta el mismo "nombre" como META-INF / services / com.example.Interface en su JAR, ¿verdad? Salvo alguna manera esta obra con los analizadores XML chorro ...

Por supuesto, todo esto supone que eran lo suficientemente inteligente / tipo para llamar ClassLoader.getSystemClassLoader () en lugar de utilizar ClassLoader.getSystemResources (...), ClassLoader.getSystemResourceAsStream (...), etc., como en el Este último caso no hay manera de conectar el cargador de clases y proporcionar el archivo falsificada.

supongo que en ese caso yo podría utilizar BCEL para manipular los archivos de clase cuando mi código está siendo empaquetado por Maven, en lugar de esperar hasta que el tiempo de ejecución de hacerlo con cglib?

¿Fue útil?

Solución

La idea era que he descrito a lo largo del camino correcto. El error que hice fue pensar en que el uso de ClassLoader.getResourceAsStream(..) para acceder a los contenidos de las direcciones URL. En lugar de ello, sólo debe URL.openStream().

Si hubiera encontrado antes de publicar, java.util.ServiceLoader (@since 1.6) proporciona una idea de cómo hacer las cosas correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top