Java Service Provide API应该如何工作?

似乎每个人都对Java服务提供程序有一个不愉快的画笔,你可以用一个名为META-INF / services / com.example.Interface的文件来做,但除了尝试加载正确的XML解析器之外没人用。我正在尝试使用一个使用服务提供程序API的库,并欺骗它,以便我可以提供一些运行时扩展类(使用cglib),这些类实际上不实现接口,但可以轻松地实现。 基本上,我认为我需要执行的步骤是: 创建一个自定义类加载器,它将响应getResources(...)并返回一个“额外”URL 还有那个类加载器钩子getResourceAsStream(...)返回一个我要用cglib操作的类的列表,当被要求提供“额外”资源时 最后,让类加载器在请求时加载这些类 但这就是我迷路的地方。例如,当库试图确定哪些实现者在那里时,它调用getResources(...),它返回一堆URL。但是getResourceAsStream(...)不接受URL,它需要“名称”。名称似乎是类路径相关的,因此到处都是相同的。所以META-INF / services / com.example.Interface在它们的JAR中与META-INF / services / com.example.Interface具有相同的“名称”,对吧?除了某种方式,这适用于那些爆破的XML解析器...... 当然,所有这些都假设它们足够聪明/善于调用ClassLoader.getSystemClassLoader()而不是使用ClassLoader.getSystemResources(...),ClassLoader.getSystemResourceAsStream(...)等,就像后一种情况那样无法挂钩ClassLoader并提供伪造文件。 我想在那种情况下,当我的代码由Maven打包时,我可以使用BCEL来操作类文件,而不是等到运行时用cglib来完成它?     
已邀请:
我描述的想法是沿着正确的轨道。我犯的错误是认为使用
ClassLoader.getResourceAsStream(..)
来访问URL的内容。相反,你应该只是
URL.openStream()
。 如果我在发布之前找到它,
java.util.ServiceLoader
(@since 1.6)提供了一些如何正确处理事情的见解。     

要回复问题请先登录注册