Как должен работать Java Service Provide API?

Похоже, что у всех была неприятная встреча с Java Service Provider , которую вы можете сделать с файлом с именем META-INF / services / com.example.Interface, но который никто не использует за исключением попытки загрузить правильный XML-анализатор. Я пытаюсь работать с библиотекой, использующей API поставщика услуг, и обмануть ее, чтобы я мог предоставить некоторые классы, расширенные во время выполнения (с использованием cglib), которые на самом деле не реализуют интерфейс, но их можно легко заставить сделать это.

В основном, я думаю, что мне нужно выполнить следующие шаги:

  1. Создайте собственный загрузчик классов, который будет отвечать на getResources (...) и возвращать «дополнительный» URL.
  2. Также есть этот обработчик загрузчика классов getResourceAsStream (...) чтобы вернуть список классов, которыми я собираюсь управлять с помощью cglib, при запросе "дополнительного" ресурса
  3. Наконец, пусть этот загрузчик классов загружает эти классы по запросу

Но вот где я заблудился. Например, когда библиотека пытается определить, какие есть разработчики, она вызывает getResources (...), который возвращает кучу URL-адресов. Но getResourceAsStream (...) не принимает URL-адреса, он принимает «имена». Имена, которые кажутся относительными к классам, и поэтому везде одинаковы. Итак, META-INF / services / com.example.Interface в имеет то же «имя», что и META-INF / services / com.example.Interface в их JAR, верно? За исключением того, что это работает с этими взорванными синтаксическими анализаторами XML ...

Конечно, все это предполагает, что они были достаточно умны / добры, чтобы вызвать ClassLoader.getSystemClassLoader () вместо использования ClassLoader.getSystemResources (...), ClassLoader.getSystemResourceAsStream (...) и т. д., так как в последнем случае ' у меня нет возможности подключить ClassLoader и предоставить поддельный файл.

Я полагаю, в этом случае я мог бы использовать BCEL для управления файлами классов, когда мой код упаковывается Maven, вместо того, чтобы ждать, пока среда выполнения сделает это с помощью cglib?

5
задан jonathan-stafford 21 December 2010 в 13:05
поделиться