小编jon*_*ord的帖子

Java Service Provide API应该如何工作?

似乎每个人都对Java服务提供程序有一个不愉快的画笔,你可以用一个名为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在它们的JAR中与META-INF/services/com.example.Interface具有相同的"名称",对吧?除了某种方式,这适用于那些爆破的XML解析器......

当然,所有这些都假设它们足够聪明/善于调用ClassLoader.getSystemClassLoader()而不是使用ClassLoader.getSystemResources(...),ClassLoader.getSystemResourceAsStream(...)等,就像后一种情况那样无法挂钩ClassLoader并提供伪造文件.

我想在那种情况下,当我的代码由Maven打包时,我可以使用BCEL来操作类文件,而不是等到运行时用cglib来完成它?

java provider service bcel cglib

5
推荐指数
1
解决办法
1571
查看次数

标签 统计

bcel ×1

cglib ×1

java ×1

provider ×1

service ×1